一、equals與hashCode的聯繫
- 如果兩個對象x和y滿足x.equals(y) == true,它們的哈希碼(hash code)應當相同。
- Java對於eqauls方法和hashCode方法是這樣規定的:
- 如果兩個對象相同(equals方法返回true),那麼它們的hashCode值一定要相同;
- 如果兩個對象的hashCode相同,它們並不一定相同。
- 當然,你未必要按照要求去做,但是如果你違背了上述原則就會發現在使用容器時,相同的對象可以出現在Set集合中,同時增加新元素的效率會大大下降(對於使用哈希存儲的系統,如果哈希碼頻繁的衝突將會造成存取性能急劇下降)。
二、equals方法
- 首先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。
- 實現高質量的equals方法的訣竅包括:
- 使用==操作符檢查"參數是否爲這個對象的引用";
- 使用instanceof操作符檢查"參數是否爲正確的類型";
- 對於類中的關鍵屬性,檢查參數傳入對象的屬性是否與之相匹配;
- 編寫完equals方法後,問自己它是否滿足對稱性、傳遞性、一致性;
- 重寫equals時總是要重寫hashCode;
- 不要將equals方法參數中的Object對象替換爲其他的類型,在重寫時不要忘掉@Override註解。