Collections.sort()和将元素添加到TreeSet中以获取排序集合之间的区别是什么?

13
 Set<Student> ts = new TreeSet<Student>();

    for(Student s : studentInfo){
         ts.add(s);
    }

    System.out.println(ts);

我已经在一个case块中编写了上述片段,以便对学生对象集合进行排序。 我的问题是:使用这种方法与使用Collections.sort();方法有什么区别。


1
Collection.sort() 可以通过使用比较器方法进行优化,该方法将根据您定义的属性对集合对象进行排序,您可以选择任何属性作为决定因素,并创建一个比较类来定义具有该属性的比较方法。 - Hussain Akhtar Wahid 'Ghouri'
2个回答

13
区别在于 TreeSet 会始终保持数据排序,而调用 Collections.sort() 方法时才对 Set 进行排序。 Collections.sort() 的时间复杂度为 O(n*log(n)),而 TreeSetadd() 复杂度是 log(n)。如果使用相同大小的数据,则在 TreeSet 的情况下复杂度将相同,因为您需要重复执行 add 操作 n 次。
因此,您只需决定是否想要始终排序 Set,还是仅在某些时刻排序。如果代码中有一种情况不需要排序,则不需要使用 TreeSet,但如果始终需要排序,则应使用 TreeSet
请记住,如果要对 Set 进行排序,必须首先从中创建一个 List,这可能会引入一些开销!
另一个注意点是:正如其他人提到的,TreeSet 只能使用 1 个 Comparator,而您可以向 Collections.sort() 提供不同的 Comparator。因此,它取决于您的使用情况。为了给您全面的答案,您应该提供更多关于您的用例的信息。

当你的评论到达时,我正在编辑我的回答。现在已经加上了。 - Adam Arold
@AdamArold 我创建了一个名为 studentInfo 的 LinkedList,并在第一个 case 中向其中添加了 Student 对象。我在第二个 case 块中使用了 TreeSet 来对同一集合进行排序。 - Anjan Baradwaj
你应该直接使用 Collections.sort() - Adam Arold
顺便提一下,一个Set会删除重复项(由比较器定义),而List允许任意数量的重复项。 - Peter Lawrey
1
@AnjanBaradwaj ArrayList的最坏情况添加时间更长,但平均速度要快得多。它还使用更少的内存(仅为1/4)。其引用在内存中是连续的,使得随机访问和顺序访问更加高效。 - Peter Lawrey
显示剩余3条评论

7

1) 与所有Set一样,TreeSet会拒绝重复的值。

2) 当你插入元素时,TreeSet会在每次插入后保持排序,而使用Collections.sort()排序的列表只能在调用sort()后进行排序(并且不会在添加元素后保持此排序)。

3) Collections.sort()允许使用不同的Comparators根据不同的标准对列表进行排序。对于TreeSet,您也可以提供一个Comparator,但您需要为每个Comparator实例化一个新的TreeSet


第三点并不是必要的,因为您也可以向TreeMap提供一个Comparator - Adam Arold
我的意思是,使用Sets时,您需要为每个Comparator实例化一个TreeSet,而Collections.sort()允许使用不同的Comparators对同一列表进行排序。 - Arnaud Denoyelle
@AdamArold 你是不是想说 TreeSet - Prasad Kharkar
是的。内部 TreeSet 使用了一个 Map - Adam Arold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接