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不判断 --------------------编程问答-------------------- 那为什么网上很多人的回答都是用iterator()方法?不懂了 --------------------编程问答--------------------
那只是它的迭代器,Set接口就是设计成无重复的,避免重复是通过hashCode和equals保证的。 --------------------编程问答--------------------
正解 --------------------编程问答-------------------- equals方法 --------------------编程问答-------------------- 同楼上~
equals() --------------------编程问答-------------------- 实际上 HashSet 内部是靠着 HashMap 来实现的。 --------------------编程问答-------------------- 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()方法 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
看 TreeSet的文档:
。。。。 --------------------编程问答-------------------- 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