黑马程序员技术交流社区

标题: set [打印本页]

作者: 张海洋    时间: 2013-3-22 18:23
标题: set
HashSet和TreeSet
有什么关系?
作者: 刘凯    时间: 2013-3-22 18:30
本帖最后由 刘凯 于 2013-3-22 18:31 编辑

都是set接口的子类
HashSet 根据hashCode方法和equals方法来判断集合里是否有相同的对象,如果有不进行存储,如果没有就存储
TreeSet 集合可以排列存储的对象,是根据存储对象的compareTo的方法来比较的 所以用该集合存储的对象必须实现Comparable这个接口 并复写compareTo
            或者创建TreeSet对象的时候传入一个比较器 比较器需实现Comparator接口,覆盖compare方法
作者: HM刘博    时间: 2013-3-22 18:38
HashSet和TreeSet都实现了Set接口。

HashSet:数据结构是哈希表。线程是非同步的。
保证元素唯一性的原理:判断元素的hashCode值是否相同。如果相同,还会继续判断元素的equals方法,判断内容是否为true。

TreeSet:可以对Set集合中的元素进行排序。底层数据结构是二叉树。
保证元素唯一性的依据:调用compareTo方法,元素相等就return 0.
作者: 安鹏宇    时间: 2013-3-22 18:57
我觉得当你觉得两个关键字有什么联系或者什么区别时可以查看一下AIP
通过API可以知道它们两个同是java.util.AbstractSet的子类 同样实现
Serializable, Cloneable, Iterable<E>, Collection<E>, Set接口
API中有很详细的对它们的介绍。。。。。这也是一个学习方法
作者: 陈志强    时间: 2013-3-22 20:17
hashSet:底层数据结构是哈希表,在哈希表里面哈希值重复的时候,哈希表还有一次检验方式,就是判断元素位置,对象是否相同,当哈希值相同的时候,但是元素对象不同,这个时候会在已有的哈希值下面顺延,表示两个对象都在同一个地址上。hashSet是如何保证元素唯一性的呢?是通过元素的两个方法,hashcode和equals来完成,如果元素的hashcode值相同,才会判断equals是否为true。如果元素的hashcode值不同,不会调用equals。  注意,对应判断元素是否存在以及删除等操作,依赖的方法是元素的hashcode和equals方法。

TreeSet是可以对Set集合中的元素进行排序,按照自然顺序。往里面存的对象必须具备比较性。
TreeSet底层数据结构,二叉树
TreeSet不看是怎么比的,而是看compareTo结果。保证元素唯一性的依据是compareTo的方法ruturn0

排序方式1,让元素自身具备比较性,元素需要实现compare接口。覆盖compareTo方法。这种方式也成为元素的自然顺序,或者叫做默认顺序。

排序方式2
当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式,这时就要看构造函数。comparator将比较器对象作为参数传递给集合的构造函数。当两种排序都存在时,以比较器为主。定义一个类实现comparator接口,覆盖compare方法。
这是我看视频的笔记,希望对你有帮助
作者: 朱盛文    时间: 2013-3-22 20:35
HashSet
             底层数据结构是哈希表。
             保证元素的唯一性:
                         它依赖两个方法:hashCode()和equals()
                         首先判断哈希值是否相同:
                                不同:就把元素添加到集合中。
                                相同:继续进入equals方法比较
                                          返回true,说明元素重复,不存。
                                          返回false,就把元素添加到集合中。

TreeSet
            底层数据结构是二叉树。
            可以让集合中的元素排序。
            保证元素的唯一性:
                   它是根据比较返回的值是0,说明元素是重复的,就不添加。
                   有两种实现方案:
                              A:让自定义对象具备比较性
                                        实现Comparable接口
                              B:让集合具备比较性
                                        实现Comparator接口




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