重寫equals方法時重寫hashcode方法的必要性

首先明確一點,咱們如今用的equals方法都是string重寫過的,而並不是原生的object類下的。code

 

那若是重寫了equals方法,而沒有重寫hashcode方法會出現什麼狀況呢?對象

若是重寫了equals方法,那麼能夠確保兩個比較對象的屬性是相同的,那麼此時若是未重寫hashcode方法,因爲hashcode比較是內存地址是否相同,那麼此時不重寫hashcode方法的話,會使用原生的object類下的hashcode方法,那兩個比較對象的內存地址確定是不一樣的,這顯然是不符合規則。內存

 

因此重寫equals方法的時候,必須保證重寫hashcode方法string

1. 若是兩個對象相同(即用equals比較返回true),那麼它們的hashCode值必定要相同!!!!;hash

2. 若是兩個對象不一樣(即用equals比較返回true),那麼它們的hashCode值可能相同也可能不一樣;(重寫equals方法,未重寫hashcode狀況下)object

3. 若是兩個對象的hashCode相同(存在哈希衝突),那麼它們可能相同也可能不一樣(即equals比較多是false也多是true)方法

4. 若是兩個對象的hashCode不一樣,那麼他們確定不一樣(即用equals比較返回false)co

 

 

想一下如果重寫了equals方法,但未重寫hashcode方法的話,在實際應用中帶來的嚴重後果

以hashset舉例,咱們都知道hashset存儲的是無序不重複的對象,那他是如何實現的?

首先經過equals方法判斷兩個對象是否相等,而後根據調用兩個對象的hashcode方法獲得他們的hashcode值。若是此時只重寫了equals方法,而未對hashcode方法重寫,那麼結果就是比較後發現二者的內存地址不一樣,認爲這是兩個不一樣的對象,而後存儲的時候就會都存儲進來,而且存儲在不一樣的位置。這就不符合了hashset的原則了。出現了兩個相同的對象

相關文章
相關標籤/搜索