API 文件有对对象的状态指定出必须遵守的规则:
如果两个对象相等,则hashcode必须也是相等的。
如果两个对象相等,对其中一个对象调用equals()必须返回true。
也就是说,若a.equlas(b)则b.equals(a)。
如果两个对象有相同的hashcode值,它们也不一定是相等的。但是
若两个对象相等,则hashcode值一定是相等的。
因此若equals()被覆盖过,则hashCode()也必须被覆盖过。
hashCode()的默认行为是对在heap上的对象产生独特的值。如果
你没有override过hashCode()。则该class的两个对象怎么都不会
被认为是相等的。
equals()的默认行为是执行==的比较。也就是说回去测试两个引用
是否对上heap上同一个对象。如果equals()没有被覆盖过,两个对
象永远都不会被视为相等的,因为不同的对象有不同的字节组合。
a.equals(b)必须与a.hashCode()==b.hashCode()等值。
但是a.hashCode()==b.hashCode()不一定要与a.equals(b)相等。
注:这是我从《HEADFIRST JAVA》上摘抄的章节要点,这部书总体翻译非常棒语言通俗易懂非常适合新手。
但是书的后部分的翻译风格与翻译的认真程度还是精确度都与前面不分有不小差距。原因就是本来看的特别流
畅的一本书突然看得磕磕绊绊好像看不懂了。