列出与可比较的Vs TreeSet

时间:2011-08-07 06:27:24

标签: java collections comparable listiterator

选项1:创建一个实现Comparable的列表,并在每次添加值时使用collections.sort(List l)对其进行排序。 选项2:创建一个TreeSet(它始终保持自己的排序)。

哪一个会更快?我问这个是因为List给了我ListIterator的选项,在我的情况下我需要它,因为它允许我在迭代时添加一个元素。

3 个答案:

答案 0 :(得分:13)

最重要的差异:

Criterion       | List with Collections.sort | TreeSet 
----------------+----------------------------+---------
cost of adding  | O(n log n)                 | O(log n)
equal sort keys | permitted                  | eliminated as duplicates
iteration       | bidirectional, can insert  | unidirectional, can not insert

要在迭代时插入元素而不获取ConcurrentModificationException,您可以执行以下操作:

for (E e : new ArrayList<E>(collection)) {
    // some other code

    collection.add(anotherE);
}

答案 1 :(得分:3)

Collections.sort使用修改后的合并排序与 nlog(n)排序时间。如果您在每次添加时调用该方法,最终可能会使用 n ^ 2log(n)时间。而TreeSet中的插入保证为log(n)。因此,如果您在每次添加时调用它,它将变为 n.log(n)。所以我建议改用TreeSet。但TreeSet不允许重复,因此可能会影响您的决定。

如果您使用的是List,那么您可以做一件事来优化;而不是使用Collections.sort。如您所知,每次在列表中插入元素时,列表都已经排序,因此使用插入排序可以提供更好的性能,因为在这种情况下插入排序的性能会更好。

答案 2 :(得分:2)

在这里使用TreeSet。

添加到TreeSet是log(n)操作。添加到列表是常量时间,但对其进行排序为n log(n)