选项1:创建一个实现Comparable的列表,并在每次添加值时使用collections.sort(List l)对其进行排序。 选项2:创建一个TreeSet(它始终保持自己的排序)。
哪一个会更快?我问这个是因为List给了我ListIterator的选项,在我的情况下我需要它,因为它允许我在迭代时添加一个元素。
答案 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)
。