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

时间:2014-09-01 09:07:49

标签: java collections

我所有人都在阅读有关此主题的大量博客,但我仍然无法清楚知道何时使用另一个散列集或树集。

举一个例子:

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

  2. 而Treeset默认情况下始终使用compareTo或比较(obj1,obj2) 。因此,TreeSet会影响性能,但输出与#1(Collections.sort)相同。

  3. 这种理解是否正确?

1 个答案:

答案 0 :(得分:61)

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

使用树结构(算法手册中的红黑树)实现

TreeSet 。集合中的元素已排序,但add,remove和contains方法的时间复杂度为O(log(n))。它提供了几种处理有序集的方法,如first(), last(), headSet(), tailSet()等。

1)HashSetTreeSet之间的第一个主要区别是表现。 HashSetTreeSet快,如果不需要对元素进行排序,则应该是首选。

2)HashSetTreeSet之间的第二个区别是HashSet允许空对象,但TreeSet不允许空对象并抛出NullPointerException,为什么,因为TreeSet使用compareTo()方法比较密钥,而compareTo()会抛出java.lang.NullPointerException

3)HashSetTreeSet之间的另一个重要区别是,HashSetHashMap支持,而TreeSet由Java中的TreeMap支持。 / p>

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

5)现在HashSetTreeSet之间最重要的区别是排序。 HashSet无法保证任何订单,而TreeSet维护的对象采用Java中ComparableComparator方法定义的排序顺序。

6)TreeSet不允许插入Heterogeneous个对象。如果尝试添加hetrogeneous对象,它会在classCastException处抛出Runtime,而HashSet则允许使用hetrogeneous对象。