为了账号安全,请及时绑定邮箱和手机立即绑定

为何Set中的contains 方法运用的是hashCode+equals的模式 而List里面是equals的 模式?

hashCode表示的是对象的地址吧,那直接equals不就行了?

正在回答

4 回答

详细的可以去看HashMap的contains实现,那里是equals和hashCode两个同时使用了,所以在有Map的时候,必须两个都要验证。HashSet也验证两个。但是在ArrayList里不验证hashCode,所以你不重写hashCode也无所谓。

equals和hashcode方法要同时重写,并且要在equals为true的时候,hashCode必须要相同。这个已经是一种不成文的规定了,这两个方法要重写就要一起重写,而且IDE里也会将只重写一个视为警告。所以这两个方法要同时重写。



0 回复 有任何疑惑可以回复我~

equals 方法在非空对象引用上实现相等关系:

自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。

对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。

传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。

一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。

对于任何非空引用值 x,x.equals(null) 都应返回 false。

Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。


参数:

obj - 要与之比较的引用对象。

返回:

如果此对象与 obj 参数相同,则返回 true;否则返回 false。


0 回复 有任何疑惑可以回复我~

Set的子类是HashSet,具体什么原因不知道,不过通过子类初始化,就存在hash了不是吗

0 回复 有任何疑惑可以回复我~

因为List 那里没有用到 hash 的方法,一般情况下我们重写都会把两个都重写的。

0 回复 有任何疑惑可以回复我~
#1

qq电子时代

List中对equals进行重写,重写以前是怎么执行的,重写后又怎么执行的 能不能举举例子
2016-04-11 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

为何Set中的contains 方法运用的是hashCode+equals的模式 而List里面是equals的 模式?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信