java 关于集合Set接口的实现类中 元素相等的问题

Set中的hashCode是否是用来确定元素在集中位置的东西?如果是的话,为什么不能单凭equal()方法检验两个元素是否相同呢?Set集中不是不能含有相同元素吗?

HashSet确实是靠hashcode来运算出这个元素应该存放在什么地方。
但是不同的对象,hashcode也可能会相同。
这时就发生了冲突,需要再次比较发生冲突的两个或多个元素是否相同(通过equals方法)。
如果相同添加失败,如果不同添加成功。

为什么不直接用equals比较是否相同?
因为不知道该跟哪个元素比较啊,难不成遍历整个Set来比较?
如果有一万个元素呢,那么将会很费时间。
而先算出hashcode在比较有个好处。

只要hashcode不同,则可以确定元素不同。只有hashcode相同的情况下,元素才有可能相同。

hashcode的性质:
如果两个元素相同,那么其hashcode必定相同。
如果两个元素不同,那么不要求其hashcode一定不同。(但是如果不同的元素尽量能返回不同的hashcode,那么将有助于提高HashSet的性能)
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-16
当向集合set中增加对象时,首先计算要增加对象的hashCode码,根据该值来得到一个位置来存放当前的对象,当在该位置没有一个对象存在的话,那么集合set认为该对象在集合中不存在,直接增加进去。如果在该位置有一个对象的话,接着将准备增加到集合中的对象与该位置上的对象进行equals方法比较,如果该equals方法返回false,那么集合认为集合中不存在该对象,再进行一次散列,将该对象放到散列后计算出的新地址里,如果equals方法返回true,那么集合认为集合中已经存在该对象了,不会再将该对象增加到集合中了
第2个回答  2013-05-16
请参看源码
Set中元素的位置由集合的大小(默认初始化为8还是16忘了)和元素的hashCode决定
第3个回答  2013-05-16
因为java 规范,equals 相同,hashcode 必须相同
第4个回答  2013-05-16
集合为啥不能含有相同的元素?追问

集合类型的特点
List集合中允许有重复元素,而Set集合不可以

相似回答