当前位置:编程学习 > JAVA >>

Set是如何判断是否有重复元素

Set是如何判断是否有重复元素 求详解 --------------------编程问答-------------------- hashCode和equals方法,在加入的时候判断,加入后就不判断了 --------------------编程问答-------------------- 哦,学习了,应该是吧 --------------------编程问答-------------------- Set只是接口。
是无重复元素集合的一种抽象。
如果楼主想问,如何实现无重复,
那就要问具体的Set的实现类。
比如,HashSet、TreeSet等等。
HashSet是通过回调存入元素的equals方法,来区分元素是否相同的,
当然,HashCode方法,加速了相同元素的比较过程。
TreeSet是通过回调存入元素的compare方法,来区分元素是否相同的。
compare方法将元素变成有序的集合。
--------------------编程问答-------------------- 貌似是compareTo方法,具体是哪个,楼主再查查好了。
长时间不用,有些遗忘了。 --------------------编程问答-------------------- 通过hashCode的hash码进行判断的 --------------------编程问答-------------------- HashSet是这样实现的: 先去目标元素x的hashCode 根据散列函数(取余)找到索引index,然后再index这个索引的链表中一次查找,查找的方法是:

首先比较hashCode值,若不相等,说明两个对象肯定不相同,若相同再用equals()比较,按照这样的方法,直到遍历完或者发现重复

我记得是这样,本人也初学JAVA  

TreeSet 我猜想是根据比较器判断的吧,当中会选择是在左子树,还是在右子树中查找吧 --------------------编程问答-------------------- set会判断
list iterator不判断 --------------------编程问答--------------------
引用 2 楼 tonytone2008 的回复:
哦,学习了,应该是吧
那为什么网上很多人的回答都是用iterator()方法?不懂了 --------------------编程问答--------------------
引用 8 楼 zhuxiuwu2009 的回复:
引用 2 楼 tonytone2008 的回复:
哦,学习了,应该是吧
那为什么网上很多人的回答都是用iterator()方法?不懂了

那只是它的迭代器,Set接口就是设计成无重复的,避免重复是通过hashCode和equals保证的。 --------------------编程问答--------------------
引用 9 楼 focusforce 的回复:
引用 8 楼 zhuxiuwu2009 的回复:
引用 2 楼 tonytone2008 的回复:
哦,学习了,应该是吧
那为什么网上很多人的回答都是用iterator()方法?不懂了

那只是它的迭代器,Set接口就是设计成无重复的,避免重复是通过hashCode和equals保证的。


正解 --------------------编程问答-------------------- equals方法 --------------------编程问答-------------------- 同楼上~
equals() --------------------编程问答-------------------- 实际上 HashSet 内部是靠着 HashMap 来实现的。 --------------------编程问答--------------------
引用 8 楼 zhuxiuwu2009 的回复:
引用 2 楼 tonytone2008 的回复:
哦,学习了,应该是吧
那为什么网上很多人的回答都是用iterator()方法?不懂了
set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals(  
)是判读两个set是否相等。 equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。   这是我网上找到的答案 --------------------编程问答-------------------- iterator()不过是个迭代器,iterator()的作用不是判断重复而是遍历 --------------------编程问答-------------------- 我刚遇到这个问题,查了下java源码 

set是接口,具体判断如何是否重复元素还得看其具体实现 

hashset 和treeset实现原理不一样 

但看hashset源码 hashset里面包装了一个hashmap

hashset的功能都有hashmap实现 

所以hashset判断重复是根据HashMap实现的 --------------------编程问答-------------------- --------------------编程问答-------------------- 以HashSet为例,Person类中 (1)s1 = "李娜" 20 (2)s2 = "李娜" 20 (这里简写了)存入集合的时候,正常情况下是可以存入的,原因是在你用add方法添加的时候,add方法底层比较这两个对象的哈希值,而s1和s2的哈希值是不同的,所以就存入进去了,但是我们认为这两个对象是相同的,所以就要重写person类中的hashCde方法和equals方法,就可以只存入一个了。不知道你明白了吗? --------------------编程问答-------------------- iterator()不能判断重复这个我能理解,可是,set到底是怎么判断重复的,能说具体一点吗? --------------------编程问答-------------------- 重写hashcode()和equals()方法 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 19 楼 sgh958663449 的回复:
iterator()不能判断重复这个我能理解,可是,set到底是怎么判断重复的,能说具体一点吗?


看 TreeSet的文档:

引用
Note that the ordering maintained by a set (whether or not an explicit comparator is provided) must be consistent with equals if it is to correctly implement the Set interface. (See Comparable or Comparator for a precise definition of consistent with equals.) This is so because the Set interface is defined in terms of the equals operation, but a TreeSet instance performs all element comparisons using its compareTo (or compare) method, so two elements that are deemed equal by this method are, from the standpoint of the set, equal. The behavior of a set is well-defined even if its ordering is inconsistent with equals; it just fails to obey the general contract of the Set interface. 

。。。。 --------------------编程问答-------------------- hashCode
int hashCode()返回 set 的哈希码值。一个 set 的哈希码定义为此 set 中所有元素的哈希码和,其中 null 元素的哈希码定义为零。这就确保对于任意两个 set s1 和 s2 而言,s1.equals(s2) 就意味着 s1.hashCode()==s2.hashCode(),正如 Object.hashCode() 的常规协定所要求的那样。 

equals
boolean equals(Object o)比较指定对象与此 set 的相等性。如果指定的对象也是一个 set,两个 set 的大小相同,并且指定 set 的所有成员都包含在此 set 中(或者,此 set 的所有成员都包含在指定的 set 中也一样),则返回 true。此定义确保了 equals 方法可在不同的 set 接口实现间正常工作。  --------------------编程问答-------------------- http://blog.csdn.net/zhangerqing
里面有专门介绍集合类的一篇,并且有详细说明:set是如何保证不重复的。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,