黑马程序员技术交流社区

标题: Set如何确定唯一性 [打印本页]

作者: 谷龙强    时间: 2013-7-31 09:29
标题: Set如何确定唯一性
本帖最后由 杨兴庭 于 2013-7-31 20:26 编辑

往Set集合中添加自定义类型对象时是如何保证元素的唯一性的呢?
作者: jialihong    时间: 2013-7-31 09:44
首先通过元素的hashCode方法,如果两个元素的hashCode值相同。
然后才会判断两个元素的内容是否相同,用的是equals方法。如果返回true。那么就视为相同元素。不进行存储。
作者: 哪颗最亮的星星    时间: 2013-7-31 09:55
首先要明确是的Set 是一个接口,不能创建实例对象,哪么就只有创建它的子类对象,最常用的有HashSet、TreeSet,如果使用HashSet的话,想要保证数据的唯一性,就要复写它的hashCode和equals方法。如果使用的是TreeSet就要实现Complarable接口的compareTo方法来保证数据的唯一性。
作者: 花心々小土豆    时间: 2013-7-31 11:09
哇!你无意间我问到一个面试题啊,记得老师当时问我HashSet是如何保证唯一性的。
我觉得Set集合是通过equals()方法来保证元素的唯一性的,我们知道集合里存放的是对象,Set集合里没有重复的元素(也就是不会出现相同的对象),当有新的元素进入集合的时候,它会和集合里的元素进行比较,如果相同就不存入,不同才添加进来。判断对象是不是相同用的就是equals()。
由于Set集合内部不同的存储形式还有其他方法辅助来确定唯一性。比如HashSet中的hashCode()方法可以减少equals()的比较次数,hashCode()值相同的元素不会太多。
作者: の放下执著    时间: 2013-7-31 11:54
首先:集合Set是一个接口,实现它的类有那么几个,但有两个很重要:一个是HashSet,一个是TreeSet。
要问在Set集合中如何保证自定义类型对象的唯一性,那么一定要分情况说:
因为它们的底层数据结构不同:HashSet的底层数据结构是哈希表,TreeSet的底层数据结构是二叉树。

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

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






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