A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 倉促、尋找你 中级黑马   /  2014-1-16 00:54  /  1581 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Set集合的添加是如何实现唯一性的?为什么是无序的?求具体说明一下。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

6 个回复

倒序浏览
Set集合的唯一性是靠Object类中equals方法经过对比两个元素来确定它们是不是同一个元素. 重写元素下的该方法可以自定义比较的条件.

Set集合不完全算是无序的, 只是底层没有角标不能通过角标操作集合元素而已.

TreeSet根据元素的自然顺序排序 (其中元素通过实现Comparable接口中的compareTo()方法获得跟其他元素对比的功能)
HashSet根据元素的哈希码排序 (其中元素通过继承Object类中HashCode()方法来获得跟其他元素对比的功能). 重写这些方法, 或者在创建Set对象的时候加入自己编写的Comparator作为参数就可以控制Set中元素的顺序了

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
--< java.util >-- Set接口:
Set接口中的方法和Collection中方法一致的。Set接口取出方式只有一种,迭代器。
|--HashSet:底层数据结构是哈希表,线程是不同步的。无序,高效;
HashSet集合保证元素唯一性:通过元素的hashCode方法,和equals方法完成的。
当元素的hashCode值相同时,才继续判断元素的equals是否为true。
如果为true,那么视为相同元素,不存。如果为false,那么存储。
如果hashCode值不同,那么不判断equals,从而提高对象比较的速度。
      |--LinkedHashSet:有序,hashset的子类。
|--TreeSet:对Set集合中的元素的进行指定顺序的排序。不同步。TreeSet底层的数据结构就是二叉树。
哈希表的原理:
1,对对象元素中的关键字(对象中的特有数据),进行哈希算法的运算,并得出一个具体的算法值,这个值 称为哈希值。
2,哈希值就是这个元素的位置。
3,如果哈希值出现冲突,再次判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就存储,在原来对象的哈希值基础 +1顺延。
4,存储哈希值的结构,我们称为哈希表。
5,既然哈希表是根据哈希值存储的,为了提高效率,最好保证对象的关键字是唯一的。
这样可以尽量少的判断关键字对应的对象是否相同,提高了哈希表的操作效率。

TreeSet:
用于对Set集合进行元素的指定顺序排序,排序需要依据元素自身具备的比较性。
如果元素不具备比较性,在运行时会发生ClassCastException异常。
所以需要元素实现Comparable接口,强制让元素具备比较性,复写compareTo方法。
依据compareTo方法的返回值,确定元素在TreeSet数据结构中的位置。
TreeSet方法保证元素唯一性的方式:就是参考比较方法的结果是否为0,如果return 0,视为两个对象重复,不存。
注意:在进行比较时,如果判断元素不唯一,比如,同姓名,同年龄,才视为同一个人。
在判断时,需要分主要条件和次要条件,当主要条件相同时,再判断次要条件,按照次要条件排序。
TreeSet集合排序有两种方式,Comparable和Comparator区别:
1:让元素自身具备比较性,需要元素对象实现Comparable接口,覆盖compareTo方法。
2:让集合自身具备比较性,需要定义一个实现了Comparator接口的比较器,并覆盖compare方法,并将该类对象作为实际参数传递给TreeSet集合的构造函数。
第二种方式较为灵活。

评分

参与人数 2技术分 +1 黑马币 +3 收起 理由
田磊阳 + 1
黄晓鑫 + 3 山寨

查看全部评分

回复 使用道具 举报
因为java的collection很多都需要hashCode(),例如HashTable
比如说你往里面存了一个值,你在取这个值的时候,java实际上通过hashCode()来找那个值,因为这样通常比较快。如果你覆盖了equals()方法,意味着原来不相等的两个对象现在可能变得相等,但hashCode()的值却不相等,这样你使用HashTable就会出现存进去的东西找不到。所以当你存如集合的时候先判断hashCode的值是否相等,如果相等则不必存入

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
田磊阳 + 1
黄晓鑫 + 1 很给力!

查看全部评分

回复 使用道具 举报
判断元素的hashCode值是否相同,如果相同,再判断equals方法是否为true,两者通过唯一性。没有任何的“索引”和“key”,所以里面只能添加不同的元素,存入相同的元素就会被覆盖,所以里面绝对没有重复的元素。
回复 使用道具 举报
Set集合的元素必须覆盖hashcode和equals方法,判断元素的哈希值,并且判断元素是否重复,相同则覆盖。
回复 使用道具 举报
Set集合的元素必须覆盖hashcode和equals方法,判断元素的哈希值,并且判断元素是否重复,相同则覆盖。
因为set集合没有索引所以元素是无序的。
上面没写完,按错了。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马