或者 "为什么Sun/Oracle公司总是要求我们每次都覆盖equals()和hashCode()方法?"
众所周知,如果您重写一个对象的equals()方法或hashCode()方法,必须同时重写另一个方法,因为这两个方法之间存在一种约定:
请注意,通常需要在重写此方法 [即equals()] 时重写hashCode()方法,以便维护hashCode()方法的一般约定,该约定规定相等的对象必须具有相等的哈希码。 -- Object.equals()的API文档
为什么Object类没有实现这种方式呢:
public boolean equals(Object obj) {
return this.hashCode() == obj.hashCode()
}
如果他们这样做了,就可以避免全世界都要实现这两种方法。只覆盖hashCode()方法就足够了。
我猜这些人有不这样做的好理由,但我看不出来——请帮我澄清一下。
hashcode()
гҖӮеҸӘжңү2^32
дёӘж•ҙж•°гҖӮ - Daniel Fischerx -> y
并不意味着y -> x
。 - asterithis.hashCode() == obj.hashCode()
。这样也可以避免自动装箱(但仍然是不正确的)。 - Joachim Sauer