假设一个应用程序生成许多HashMap<String, MyClass>数据结构,每个数据结构包含几十到数百个MyClass类型的Comparable对象,这些对象需要在单个排序的Collection中结束。
此功能的两种可能实现返回SortedSet或排序列表,如下所示:
public static Set<MyClass> getSortedSet(HashMap<String, MyClass>... allMaps)
{
SortedSet<MyClass> set = new TreeSet<MyClass>();
Collection<MyClass> c;
for (HashMap<String, MyClass> map:allMaps)
{
c = map.values();
set.addAll(c);
}
return set;
}
public static List<MyClass> getSortedList(HashMap<String, MyClass>... allMaps)
{
List<MyClass> list = new ArrayList<MyClass>();
Collection<MyClass> c;
for (HashMap<String, MyClass> map:allMaps)
{
c = map.values();
list.addAll(c);
}
Collections.sort(list);
return list;
}上述两种方法中的任何一种都有明显的性能优势吗?
有没有更快的方法来实现同样的功能?
发布于 2012-05-14 22:00:38
排序列表方法的一些问题:
ArrayLists由数组支持。每当您添加一个新元素时,它可能必须在幕后增加数组。如果你想使用这种方法,你应该事先创建合适大小的ArrayList。
添加所有元素后的排序似乎不是最优的。为什么不将元素添加到列表中的正确位置?(使用排序的集合,然后转换为列表) A good Sorted List for Java
实际上,为了回答您的问题,我会采用在幕后使用TreeSet的方法。因为,如果用户愿意,他们总是可以执行Set.toArray(),然后拥有一个列表。
发布于 2012-05-14 21:51:05
集合和列表在本质上是不同的,因为集合不会保留重复项。一个对象只能有一个实例。列表允许您保留副本。
因此,集合做了更多的工作,因此它们更慢。
发布于 2012-05-14 21:55:55
有没有理由假设一种实现总是比另一种实现快?
不,没有理由假设这一点。
哪个更快取决于数据量,取决于其属性,取决于比较器的性能特征,取决于JDK,取决于JIT编译器等。
唯一确定的方法是在真实数据上对代码进行基准测试。
https://stackoverflow.com/questions/10584584
复制相似问题