3

假设一个应用程序产生了许多HashMap<String, MyClass>数据结构,每个数据结构都包含几十到几百个Comparable类型的对象MyClass,这些对象需要以单个和排序的形式结束Collection

此功能的两种可能实现返回 SortedSet 或 sorted List,如下所示:

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;
}

以上两种方法中的任何一种都会有明显的性能优势吗?

是否有更快的方法来实现相同的功能?

4

3 回答 3

4

您的排序列表方法存在一些问题:

ArrayLists 由数组支持。每当您添加一个新元素时,它可能必须在幕后增加数组。如果您想使用这种方法,您应该事先创建适当大小的 ArrayList。

添加所有元素后的排序似乎不是最佳的。为什么不将元素添加到列表中的正确位置?(使用排序集合然后变成列表)Java 的一个好的排序列表

为了真正回答您的问题,我将采用在幕后使用 TreeSet 的方法。因为,如果用户想要,他们总是可以做 Set.toArray() 然后有一个列表。

于 2012-05-14T14:00:38.260 回答
2

从某种意义上说,集合和列表的性质不同,集合不保留重复项。您只能拥有一个对象的一个​​实例。列表允许您保留重复项。

因此,集合做更多的工作,因此它们更慢。

于 2012-05-14T13:51:04.607 回答
2

有没有理由假设一种实现总是比另一种更快?

不,没有理由假设。

哪个更快可能取决于数据量、属性、比较器的性能特征、JDK、JIT 编译器等。

唯一可以确定的方法是在实际数据上对代码进行基准测试。

于 2012-05-14T13:55:55.237 回答