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

[复制链接]
查看11 | 回复5 | 2013-5-16 09:06:58 | 显示全部楼层 |阅读模式
HashSet确实是靠hashcode来运算出这个元素应该存放在什么地方。但是不同的对象,hashcode也可能会相同。这时就发生了冲突,需要再次比较发生冲突的两个或多个元素是否相同(通过equals方法)。如果相同添加失败,如果不同添加成功。为什么不直接用equals比较是否相同?因为不知道该跟哪个元素比较啊,难不成遍历整个Set来比较?如果有一万个元素呢,那么将会很费时间。而先算出hashcode在比较有个好处。只要hashcode不同,则可以确定元素不同。只有hashcode相同的情况下,元素才有可能相同。hashcode的性质:如果两个元素相同,那么其hashcode必定相同。如果两个元素...
回复

使用道具 举报

千问 | 2013-5-16 09:06:58 | 显示全部楼层
当向集合set中增加对象时,首先计算要增加对象的hashCode码,根据该值来得到一个位置来存放当前的对象,当在该位置没有一个对象存在的话,那么集合set认为该对象在集合中不存在,直接增加进去。如果在该位置有一个对象的话,接着将准备增加到集合中的对象与该位置上的对象进行equals方法比较,如果该equals方法返回false,那么集合认为集合中不存在该对象...
回复

使用道具 举报

千问 | 2013-5-16 09:06:58 | 显示全部楼层
请参看源码Set中元素的位置由集合的大小(默认初始化为8还是16忘了)和元素的hashCode决定...
回复

使用道具 举报

千问 | 2013-5-16 09:06:58 | 显示全部楼层
因为java 规范,equals 相同,hashcode 必须相同...
回复

使用道具 举报

千问 | 2013-5-16 09:06:58 | 显示全部楼层
集合为啥不能含有相同的元素?...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行