Java:Hashset与TreeSet何时应该使用其他

SR *_*han 28 java collections

我一直在阅读关于这个主题的大量博客,但我仍然无法清楚地知道何时使用另一个散列集或树集.

举一个例子:

  1. 我有一个类似的对象.我把它们放在HashSet中.现在当(只在我想要的时候)我想设置基于compareTo逻辑进行排序时,我可以调用Collections.sort(object)

  2. 而TreeSet的默认一直使用的compareTo或比较(OBJ1,OBJ2)所有的时间.因此,TreeSet会遇到性能,但输出与#1(Collections.sort)相同.

这种理解是否正确?

Ank*_*hal 86

HashSet使用哈希表实现.元素没有订购.在add, remove,和包含的方法有固定的时间复杂度为O(1) .

TreeSet使用树结构(算法手册中的红黑树)实现.集合中的元素已排序,但add,remove和contains方法的时间复杂度为O(log(n)).它提供了几种处理有序集的方法,如first(), last(), headSet(), tailSet()等.

1)HashSetTreeSet表现之间的第一个主要区别.如果不需要对元素进行排序,HashSet则速度比TreeSet并且应该是首选.

2)HashSet和之间的第二个区别TreeSetHashSet允许空对象但TreeSet不允许空对象和抛出NullPointerException,为什么,因为TreeSet使用compareTo()方法比较键compareTo()并将抛出java.lang.NullPointerException.

3)之间的另一个显著差异HashSetTreeSet的是,HashSet通过将备份HashMap,同时TreeSet由TreeMap中使用Java支持.

4)之间的一个更差HashSetTreeSet这值得记住的是,使用的HashSet equals()方法在集和用于检测重复的同时来比较两个对象TreeSet的用途compareTo()方法相同的目的.如果equals()compareTo()不一致,即对于两个相等的对象equals应该返回true而compareTo()应该返回零,而不是它将破坏Set接口的契约并且将允许像TreeSet这样的Set实现中的重复

5)之间现在最重要的区别HashSetTreeSet被订购.在以Java 或Java中的方法定义的排序顺序维护对象时,HashSet不保证任何顺序.TreeSetComparableComparator

  • 再者,树集是同类的,意味着只允许相同类型的数据,而哈希集是异构的。 (2认同)