为什么重写 equals()方法时,不能再用默认的 hashcode 实现,而必须重写 hashcode() ?
hashcode()的默认实现: Object 对象中的默认实现返回的是对象的内存地址
如果每个对象都是唯一的,则默认实现工作正常
如果重写 equals(),则表示隐含地说具有不同地址的对象可以彼此相同,在这种情况下,必须覆盖 hashcode()
想想String类.
String s1 = new String("foo");
String s2 = new String("foo");
这两个字符串相等,因此它们的哈希码必须相等.但它们是具有不同地址的不同对象.
s1 == s2 // false, different addresses
s1.equals(s2) // true, same contents
使用他们的地址作为哈希码将是一个错误.因此,String会覆盖hashCode()以确保相等的字符串具有相同的哈希码.这有助于满足hashCode()的契约,即:
If a.equals(b) is true, then a.hashCode() == b.hashCode().