黑马程序员技术交流社区

标题: 有木有人解释一下treeset和hashset的区别呢? [打印本页]

作者: liuelxiwd    时间: 2013-5-6 15:59
标题: 有木有人解释一下treeset和hashset的区别呢?
本帖最后由 liuelxiwd 于 2013-5-8 10:05 编辑

如题~~~~~~~~~~~~~~~~~

作者: 白磊    时间: 2013-5-6 16:33
TreeSet是一个有序集合,里面的元素若要实现自然排序就需要实现Comparable接口,或者你也可以自定义一个Comparator实现自己的比较方式。TreeSet底层是一棵自平衡的排序二叉树。
HashSet的底层实现是哈希散列表。HashSet中的数据是无序的,可以放入null,但只能放入一个null,HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例。
作者: 刘学明       时间: 2013-5-6 19:38
先说HashSet
HashSet集合的底层结构是一个哈希表数据结构 ,无序(存进去和取出来的顺序是不一致的),不可以存入重复的元素,  存入HashSet集合的元素(对象)需要覆盖hashCode()方法和equals()方法。
HashSet是如何保证元素的唯一性的呢?
是通过元素的两个方法 hashCode() 和equals() 方法。
如果元素的hashCode()相同,才会判断equals是否为true;
如果元素的hashCode()不同,直接存入到HashSet集合,则不会调用equals方法。

HashSet对于判断元素是否存在,以及删除等操作,依赖的是也是hashCode和equals方法。

再说TreeSet:
TreeSet底层的数据结构是二叉树数据结构  不可有重复元素,  TreeSet集合取出是有序的 ,之所以有序是因为TreeSet有两种排序方式。

TreeSet排序的第一种方式:让存入TreeSeet集合的元素自身具备比较性。
元素需要实现Comparable接口,覆盖CompareTo方法。
这种方式也称为元素的自然顺序。或者叫做默认顺序。

ThreeSet的第二种排序方式。
当元素自然不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性。
定义一个比较器类  将比较器对象作为参数传递给TreeSet集合的构造函数。

当两种排序方式都存在时 ,以比较器方式为主。
定义一个类,实现Comparator接口 覆盖compare方法。

完毕
作者: 曹睿翔    时间: 2013-5-6 21:14
能不能把标题改下,错字也太多了吧
作者: 曹睿翔    时间: 2013-5-6 21:14
问题解决就改为再次编辑已解决,不行你再问




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2