Java中equals()和hashCode

一、equals與hashCode的聯繫

  • 如果兩個對象x和y滿足x.equals(y) == true,它們的哈希碼(hash code)應當相同。
  • Java對於eqauls方法和hashCode方法是這樣規定的:
    1. 如果兩個對象相同(equals方法返回true),那麼它們的hashCode值一定要相同;
    2. 如果兩個對象的hashCode相同,它們並不一定相同。
  • 當然,你未必要按照要求去做,但是如果你違背了上述原則就會發現在使用容器時,相同的對象可以出現在Set集合中,同時增加新元素的效率會大大下降(對於使用哈希存儲的系統,如果哈希碼頻繁的衝突將會造成存取性能急劇下降)。

二、equals方法

  • 首先equals方法必須滿足:
    1. 自反性(x.equals(x)必須返回true)
    2. 對稱性(x.equals(y)返回true時,y.equals(x)也必須返回true)
    3. 傳遞性(x.equals(y)和y.equals(z)都返回true時,x.equals(z)也必須返回true)
    4. 一致性(當x和y引用的對象信息沒有被修改時,多次調用x.equals(y)應該得到同樣的返回值),而且對於任何非null值的引用x,x.equals(null)必須返回false。
  • 實現高質量的equals方法的訣竅包括:
    1. 使用==操作符檢查"參數是否爲這個對象的引用";
    2. 使用instanceof操作符檢查"參數是否爲正確的類型";
    3. 對於類中的關鍵屬性,檢查參數傳入對象的屬性是否與之相匹配;
    4. 編寫完equals方法後,問自己它是否滿足對稱性、傳遞性、一致性;
    5. 重寫equals時總是要重寫hashCode;
    6. 不要將equals方法參數中的Object對象替換爲其他的類型,在重寫時不要忘掉@Override註解。
發佈了51 篇原創文章 · 獲贊 20 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章