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

zhuxiuwu2009 2011-01-03 10:48:14
Set是如何判断是否有重复元素 求详解
...全文
3653 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
依琳小师妹 2012-12-14
  • 打赏
  • 举报
回复
http://blog.csdn.net/zhangerqing 里面有专门介绍集合类的一篇,并且有详细说明:set是如何保证不重复的。
zhaoming262350 2012-12-13
  • 打赏
  • 举报
回复
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 接口实现间正常工作。
huntor 2012-12-13
  • 打赏
  • 举报
回复
引用 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.
。。。。
eviljordan 2012-12-13
  • 打赏
  • 举报
回复
重写hashcode()和equals()方法
sgh958663449 2012-12-13
  • 打赏
  • 举报
回复
iterator()不能判断重复这个我能理解,可是,set到底是怎么判断重复的,能说具体一点吗?
dalianwang74 2012-10-08
  • 打赏
  • 举报
回复
我刚遇到这个问题,查了下java源码

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

hashset 和treeset实现原理不一样

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

hashset的功能都有hashmap实现

所以hashset判断重复是根据HashMap实现的
xinlvye 2012-10-08
  • 打赏
  • 举报
回复
以HashSet为例,Person类中 (1)s1 = "李娜" 20 (2)s2 = "李娜" 20 (这里简写了)存入集合的时候,正常情况下是可以存入的,原因是在你用add方法添加的时候,add方法底层比较这两个对象的哈希值,而s1和s2的哈希值是不同的,所以就存入进去了,但是我们认为这两个对象是相同的,所以就要重写person类中的hashCde方法和equals方法,就可以只存入一个了。不知道你明白了吗?
zhuzeitou 2011-01-05
  • 打赏
  • 举报
回复
iterator()不过是个迭代器,iterator()的作用不是判断重复而是遍历
zhuxiuwu2009 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhuxiuwu2009 的回复:]
引用 2 楼 tonytone2008 的回复:
哦,学习了,应该是吧
那为什么网上很多人的回答都是用iterator()方法?不懂了
[/Quote]set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals(
)是判读两个set是否相等。 equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。 这是我网上找到的答案
  • 打赏
  • 举报
回复
实际上 HashSet 内部是靠着 HashMap 来实现的。
zhuxiuwu2009 2011-01-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tonytone2008 的回复:]
哦,学习了,应该是吧
[/Quote]那为什么网上很多人的回答都是用iterator()方法?不懂了
sig377 2011-01-04
  • 打赏
  • 举报
回复
同楼上~
equals()
lliiqiang 2011-01-04
  • 打赏
  • 举报
回复
equals方法
tt986101dpc 2011-01-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 focusforce 的回复:]

引用 8 楼 zhuxiuwu2009 的回复:
引用 2 楼 tonytone2008 的回复:
哦,学习了,应该是吧
那为什么网上很多人的回答都是用iterator()方法?不懂了

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

正解
focusforce 2011-01-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhuxiuwu2009 的回复:]
引用 2 楼 tonytone2008 的回复:
哦,学习了,应该是吧
那为什么网上很多人的回答都是用iterator()方法?不懂了
[/Quote]
那只是它的迭代器,Set接口就是设计成无重复的,避免重复是通过hashCode和equals保证的。
goodsun00 2011-01-04
  • 打赏
  • 举报
回复
set会判断
list iterator不判断
heelp 2011-01-03
  • 打赏
  • 举报
回复
HashSet是这样实现的: 先去目标元素x的hashCode 根据散列函数(取余)找到索引index,然后再index这个索引的链表中一次查找,查找的方法是:

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

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

TreeSet 我猜想是根据比较器判断的吧,当中会选择是在左子树,还是在右子树中查找吧
Jlins 2011-01-03
  • 打赏
  • 举报
回复
通过hashCode的hash码进行判断的
冰思雨 2011-01-03
  • 打赏
  • 举报
回复
貌似是compareTo方法,具体是哪个,楼主再查查好了。
长时间不用,有些遗忘了。
冰思雨 2011-01-03
  • 打赏
  • 举报
回复
Set只是接口。
是无重复元素集合的一种抽象。
如果楼主想问,如何实现无重复,
那就要问具体的Set的实现类。
比如,HashSet、TreeSet等等。
HashSet是通过回调存入元素的equals方法,来区分元素是否相同的,
当然,HashCode方法,加速了相同元素的比较过程。
TreeSet是通过回调存入元素的compare方法,来区分元素是否相同的。
compare方法将元素变成有序的集合。
加载更多回复(2)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧