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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谷龙强 中级黑马   /  2013-7-31 09:29  /  1646 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-7-31 20:26 编辑

往Set集合中添加自定义类型对象时是如何保证元素的唯一性的呢?

评分

参与人数 1黑马币 +3 收起 理由
杨兴庭 + 3

查看全部评分

4 个回复

倒序浏览
首先通过元素的hashCode方法,如果两个元素的hashCode值相同。
然后才会判断两个元素的内容是否相同,用的是equals方法。如果返回true。那么就视为相同元素。不进行存储。
回复 使用道具 举报
首先要明确是的Set 是一个接口,不能创建实例对象,哪么就只有创建它的子类对象,最常用的有HashSet、TreeSet,如果使用HashSet的话,想要保证数据的唯一性,就要复写它的hashCode和equals方法。如果使用的是TreeSet就要实现Complarable接口的compareTo方法来保证数据的唯一性。
回复 使用道具 举报
哇!你无意间我问到一个面试题啊,记得老师当时问我HashSet是如何保证唯一性的。
我觉得Set集合是通过equals()方法来保证元素的唯一性的,我们知道集合里存放的是对象,Set集合里没有重复的元素(也就是不会出现相同的对象),当有新的元素进入集合的时候,它会和集合里的元素进行比较,如果相同就不存入,不同才添加进来。判断对象是不是相同用的就是equals()。
由于Set集合内部不同的存储形式还有其他方法辅助来确定唯一性。比如HashSet中的hashCode()方法可以减少equals()的比较次数,hashCode()值相同的元素不会太多。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
首先:集合Set是一个接口,实现它的类有那么几个,但有两个很重要:一个是HashSet,一个是TreeSet。
要问在Set集合中如何保证自定义类型对象的唯一性,那么一定要分情况说:
因为它们的底层数据结构不同:HashSet的底层数据结构是哈希表,TreeSet的底层数据结构是二叉树。

在HashSet集合中,是通过hashCode()方法与equals()方法共同作用来确定元素的唯一性的,当一个对象要进入HashSet集合中时,先判断hashCode()方法,
如果hashCode()的返回值不同,直接存入;如果相同,则继续判断equals()方法,如果equals()返回值不同,存入;如果相同,则认为重复,存不进去。

在TreeSet集合中,可以有两种方式确定元素的唯一性:一种是让要进入TreeSet的类型对象具备比较性,那么该类型变量实现Comparable接口,并复写compareTo()方法即可;一种是让集合具备比较性,可以定义一个类实现Comparator接口,并复写compare()方法,然后new一个该类对象作为参数传给TreeSet的构造函数即可。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1 赞一个!

查看全部评分

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