问题
Option 1: Make a list which implements Comparable and sort it using collections.sort(List l) every time you add a value. Option 2: Make a TreeSet (which keeps itself sorted all the time).
Which one will be faster? I am asking this because List gives me the option of ListIterator which I need in my case, since it lets me add an element while iterating.
回答1:
The most important differences:
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
To insert an element when iterating without getting a ConcurrentModificationException
, you can do:
for (E e : new ArrayList<E>(collection)) {
// some other code
collection.add(anotherE);
}
回答2:
Collections.sort uses a modified merge-sort with nlog(n) sort time. If you call the method on every addition you might end up with n^2log(n) time. Whereas insertion in TreeSet is guaranteed log(n). So if you call it on every addition it becomes n.log(n). So I would suggest using TreeSet instead. But TreeSet doesn't allow duplicates, so that might affect your decision.
If you are using List, then instead of using Collections.sort, there is one thing you can do to optimize; as you know that each time you insert the element in the list, the list is already sorted, so using insertion sort here will give you a better performance, as insertion sort performs better in such cases.
回答3:
Use TreeSet here.
Adding to TreeSet is a log(n)
operation. Adding to list is const time, but sorting it is n log(n)
.
来源:https://stackoverflow.com/questions/6971152/list-with-comparable-vs-treeset