黑马程序员技术交流社区

标题: 用什么方法来区分Set里的元素重复与否 [打印本页]

作者: 刘涛    时间: 2011-11-25 09:29
标题: 用什么方法来区分Set里的元素重复与否
本帖最后由 刘涛 于 2011-11-28 18:13 编辑

Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()?
作者: 喻尚健    时间: 2011-11-25 09:48
Set判断两个对象相同不是使用==运算符,而是根据equals方法。只要两个对象用equals方法比较返回true,Set就不会接受这两个对象;反之,只要两个对象用equals方法比较返回false,Set就会接受这两个对象。
Set的实现类HashSet会调用对象的hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值来决定该对象在HashSet中存储位置。
注意:如果有两个元素通过equals方法比较返回true,但它们的hashCode()方法返回值不相等,HashSet将会把它们存储在不同位置,也就可以添加成功。
作者: 侯伟浩    时间: 2011-11-25 10:59
是先使用hashcode方法,再使用equals方法。
hashcode的作用就是为了比较两个对象是否相等。Set集合有消除重复的功能,其去重的功能就是依靠了hashcode。
个人理解:Set集合会判断两个元素的hashcode是否相同,相同的话就去掉一个,不相同就会使用equals()方法比较。
所以只有有消除重复功能的集合(hash集合)才会用得着hashcode。所以说hashcode一般只应用在hash集合中,才有价值。
作者: laizidiyu    时间: 2011-11-25 16:16
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否
作者: 程立彬    时间: 2011-11-25 17:30
set的两个子类 HashSet和TreeSet
HashSet是通过先比较HashCode再比较equals方法来判断的
TreeSet
1):元素自身具备比较性;那么,集合中所存储的类必须实现comparble接口,并重写接口中的compareTo()方法。这种方法return值为整数;
2):当元素自身不具备比较性(更确切的说是我们无法让所存储的类实现comparble接口,例如,从数据库中得到的数据类型)或者是该类所实现的compareTo()方法并非我们所期望的时(String类型,默认是按字典顺序进行比较的),那么我们就要考虑所集合自身具备比较性.java为我们提供了一个带比较器的参数的构造函数,以做到这一点。TreeMap(Comparator<? super K> comparator)Comparator是一接口,它里面有两个方面compare()和equals(),当我们要实现这个接口时,只需重写compare()方法即可,它的返回值类型也为int型。




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