Java:Hashset vs TreeSet - 我什么时候应该使用另一个?

2022-08-31 16:33:22

我一直在阅读很多关于这个主题的博客,但我仍然无法清楚地知道何时使用一个哈希集或树集。

举个例子:

  1. 我有一个可比较的对象。我已将它们放在HashSet中。现在,当(仅当我想要)我想设置为基于compareTo逻辑进行排序时,我可以调用Collections.sort(object)

  2. 而默认情况下,Treeset 始终使用 compareTo 或 compare(obj1, obj2)。因此,TreeSet的性能将受到打击,但输出将与#1(Collections.sort)相同。

这种理解是否正确?


答案 1

哈希集是使用哈希表实现的。元素未排序。和 包含方法具有恒定的时间复杂度 O(1)。.add, remove,

TreeSet是使用树结构(算法书中的红黑树)实现的。对集合中的元素进行排序,但添加、删除和包含方法具有时间复杂度 O(log (n))。它提供了几种处理有序集的方法,如 等。first(), last(), headSet(), tailSet()

1)与性能之间的第一个主要区别。 比不需要对元素进行排序时更快,并且应该是首选。HashSetTreeSetHashSetTreeSet

2)第二个区别和是允许空对象,但不允许空对象和抛出,为什么,因为使用方法比较键并会抛出。HashSetTreeSetHashSetTreeSetNullPointerExceptionTreeSetcompareTo()compareTo()java.lang.NullPointerException

3) 和 之间的另一个显著区别是 ,由 Java 中的 NavigableMap 支持 while 支持。HashSetTreeSetHashSetHashMapTreeSet

4)两者之间的另一个区别是,值得记住的是,HashSet使用方法来比较Set中的两个对象,并在将方法用于相同目的时检测重复项。如果 和 不一致,即对于两个相等的对象,等于应返回 true,而应返回零,那么它将破坏 Set 接口的契约,并允许在 Set 实现(如 TreeSet)中重复HashSetTreeSetequals()TreeSetcompareTo()equals()compareTo()compareTo()

5)现在最重要的区别是和排序。 不保证任何顺序,同时以 Java 中的任一或方法定义的排序顺序维护对象。HashSetTreeSetHashSetTreeSetComparableComparator

6) 不允许插入对象。如果试图添加雌激素物体,它会投掷,而允许雌激素物体。TreeSetHeterogeneousclassCastExceptionRuntimeHashSet


答案 2