兩個對象值相同 (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和hashCode方法,不少Java程序員都知道,但不少人也就是僅僅知道而已,在Joshua Bloch的大做《Effective Java》(不少軟件公司,《Effective Java》、《Java編程思想》以及《重構:改善既有代碼質量》是Java程序員必看書籍,若是你還沒看過,那就趕忙去亞馬遜買一本吧)中是這樣介紹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方法的訣竅包括:

1. 使用==操做符檢查」參數是否爲這個對象的引用」;

2. 使用instanceof操做符檢查」參數是否爲正確的類型」;

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

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

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

6. 不要將equals方法參數中的Object對象替換爲其餘的類型,在重寫時不要忘掉@Override註解。程序員

相關文章
相關標籤/搜索