我所有人都在阅读有关此主题的大量博客,但我仍然无法清楚知道何时使用另一个散列集或树集。
举一个例子:
我有一个类似的对象。我把它们放在HashSet中。现在当(只在我想要)时,我想设置为基于compareTo逻辑进行排序,我可以调用Collections.sort(object)
而Treeset默认情况下始终使用compareTo或比较(obj1,obj2) 。因此,TreeSet会影响性能,但输出与#1(Collections.sort)相同。
这种理解是否正确?
答案 0 :(得分:61)
HashSet 是使用哈希表实现的。元素没有订购。 add, remove,
和包含方法具有恒定时间复杂度O(1)。
TreeSet 。集合中的元素已排序,但add,remove和contains方法的时间复杂度为O(log(n))。它提供了几种处理有序集的方法,如first(), last(), headSet(), tailSet()
等。
1)HashSet
和TreeSet
之间的第一个主要区别是表现。 HashSet
比TreeSet
快,如果不需要对元素进行排序,则应该是首选。
2)HashSet
和TreeSet
之间的第二个区别是HashSet
允许空对象,但TreeSet
不允许空对象并抛出NullPointerException
,为什么,因为TreeSet
使用compareTo()
方法比较密钥,而compareTo()
会抛出java.lang.NullPointerException
。
3)HashSet
和TreeSet
之间的另一个重要区别是,HashSet
由HashMap
支持,而TreeSet
由Java中的TreeMap支持。 / p>
4)值得记住的HashSet
和TreeSet
之间的另一个区别是HashSet使用equals()
方法比较Set中的两个对象以及检测重复项TreeSet
使用compareTo()
方法用于相同目的。如果equals()
和compareTo()
不一致,即对于两个相等的对象equals应该返回true而compareTo()
应该返回零,而不是它将破坏Set接口的契约并且将允许Set实现中的重复像TreeSet
5)现在HashSet
和TreeSet
之间最重要的区别是排序。 HashSet
无法保证任何订单,而TreeSet
维护的对象采用Java中Comparable
或Comparator
方法定义的排序顺序。
6)TreeSet
不允许插入Heterogeneous
个对象。如果尝试添加hetrogeneous对象,它会在classCastException
处抛出Runtime
,而HashSet
则允许使用hetrogeneous对象。