1. 程式人生 > >Java常考面試題6 equals相同的物件對於的hashCode是否相等?

Java常考面試題6 equals相同的物件對於的hashCode是否相等?

問:

兩個物件值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?

答:

不對!!

如果兩個物件x和y滿足x.equals(y) == true,它們的雜湊碼(hash code)應當相同。

Java對於eqauls方法和hashCode方法是這樣規定的:

(1)如果兩個物件相同(equals方法返回true),那麼它們的hashCode值一定要相同;

(2)如果兩個物件的hashCode相同,它們並不一定相同。

當然,你未必要按照要求去做,但是如果你違背了上述原則就會發現在使用容器時,相同的物件可以出現在Set集合中,同時增加新元素的效率會大大下降(對於使用雜湊儲存的系統,如果雜湊碼頻繁的衝突將會造成存取效能急劇下降)。

擴充套件:

關於equals方法

1)首先equals方法必須滿足

自反性(x.equals(x)必須返回true)、

對稱性(x.equals(y)返回true時,y.equals(x)也必須返回true)、

傳遞性(x.equals(y)和y.equals(z)都返回true時,x.equals(z)也必須返回true)

和一致性(當x和y引用的物件資訊沒有被修改時,多次呼叫x.equals(y)應該得到同樣的返回值),

而且對於任何非null值的引用x,x.equals(null)必須返回false。

2)實現高質量的equals方法的訣竅包括:

1. 使用==操作符檢查"引數是否為這個物件的引用";

2. 使用instanceof操作符檢查"引數是否為正確的型別";

3. 對於類中的關鍵屬性,檢查引數傳入物件的屬性是否與之相匹配;

4. 編寫完equals方法後,問自己它是否滿足對稱性、傳遞性、一致性;

5. 重寫equals時總是要重寫hashCode;

6. 不要將equals方法引數中的Object物件替換為其他的型別,在重寫時不要忘掉@Override註解。