重寫equals方法時重寫hashcode方法的必要性
首先明確一點,我們現在用的equals方法都是string重寫過的,而並非原生的object類下的。
那如果重寫了equals方法,而沒有重寫hashcode方法會出現什麼情況呢?
如果重寫了equals方法,那麼可以確保兩個比較物件的屬性是相同的,那麼此時如果未重寫hashcode方法,由於hashcode比較是記憶體地址是否相同,那麼此時不重寫hashcode方法的話,會使用原生的object類下的hashcode方法,那兩個比較物件的記憶體地址肯定是不同的,這顯然是不符合規則。
所以重寫equals方法的時候,必須保證重寫hashcode方法
1. 如果兩個物件相同(即用equals比較返回true),那麼它們的hashCode值一定要相同!!!!;
2. 如果兩個物件不同(即用equals比較返回true),那麼它們的hashCode值可能相同也可能不同;(重寫equals方法,未重寫hashcode情況下)
3. 如果兩個物件的hashCode相同(存在雜湊衝突),那麼它們可能相同也可能不同(即equals比較可能是false也可能是true)
4. 如果兩個物件的hashCode不同,那麼他們肯定不同(即用equals比較返回false)
想一下若是重寫了equals方法,但未重寫hashcode方法的話,在實際應用中帶來的嚴重後果
以hashset舉例,我們都知道hashset儲存的是無序不重複的物件,那他是如何實現的?
首先通過equals方法判斷兩個物件是否相等,然後根據呼叫兩個物件的hashcode方法得到他們的hashcode值。如果此時只重寫了equals方法,而未對hashcode方法重寫,那麼結果就是比較後發現兩者的記憶體地址不同,認為這是兩個不同的物件,然後儲存的時候就會都儲存進來,並且儲存在不同的位置。這就不符合了hashset的原則了。出現了