【发布时间】:2013-08-26 14:04:42
【问题描述】:
或“为什么 Sun/Oracle 的家伙每次都强迫我们同时覆盖 equals() 和 hashCode()?”
Everyone knows 说,如果你覆盖一个对象的 equals() 或 hashCode(),你也必须覆盖另一个,因为这两者之间有一个契约:
请注意,只要此方法 [即equals()] 被重写,以维护 hashCode 方法的一般合同,该合同规定相等的对象必须具有相等的哈希码。 -- API doc of Object.equals()
为什么在 Object 类中没有这样实现:
public boolean equals(Object obj) {
return this.hashCode() == obj.hashCode()
}
如果他们这样做了,世界其他地方就不必同时实施这两种方法了。只覆盖 hashCode() 就足够了。
我想这些家伙有充分的理由不这样做。我只是看不到它 - 请帮我解决这个问题。
【问题讨论】:
-
可能是因为:如果两个对象相等,它们的hashcode将相等,但是如果两个对象的hashcode相等,则没有足够的信息来保证对象本身是相等的,因为这个事实:哈希可能会发生冲突。
-
不同的对象仍然可以有相同的
hashcode()。只有2^32ints。 -
常见逻辑错误:
x -> y不代表y -> x。 -
顺便提一下,你的代码的一个更短的版本是
this.hashCode() == obj.hashCode()。它还可以避免自动装箱(它仍然是不正确的;-)) -
@Joachim thx - 我改变了它