Java:爲什麼重寫equals方法一定要重寫hashcode方法?

預備知識:

哈希函數,哈希表,HashMap數據結構。

先說結論:

因爲如果重寫equals方法後不重寫hashcode,會出現這麼一種情況:兩個equal的對象,放到hashmap數據結構中,會出現對應着兩個不同的value的情況。這意味着hashmap將兩個equal的對象判斷爲不相同。

下面解釋:

map中同一個key是對應着相同的value。而map是如何判斷key是否相同?首先它是先判斷兩個key的hashcode是否相同,如果相同的情況下,纔會接着判斷兩個key是否equal。也就是如果hashcode不同那麼就不會判斷是否equal了。在map裏這兩個key就是不同的key,儘管他們可能根據重寫的equals判斷是相同的。

爲什麼會先判斷hashcode是否相等在判斷equals?

我們要知道HashCode的存在主要是爲了查找的快捷性。默認的hashcode是根據改對象的地址通過hash算法得出的。而hash算法就是一種壓縮算法,也就是根據不同的地址計算出來的hashcode可能是相同的,那麼hashcode相同的情況下要判斷兩個對象是否相同就需要equals方法了。

因爲判斷hashcode是判斷equal的先決條件,所以纔會說hashcode相等但是equal不一定相等,但是equal相等hashcode一定相等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章