2015-11-04 65 views
-3

已經有 我已經看到了很多關於Java中所有影響不重寫的hashCode問題,我得到它, 但在這種稍有不同的情況下會發生什麼:不清楚合同的hashCode違反

的hashCode = 1且等於未被覆蓋。

HashCode合同似乎沒有被違反 - 我們返回相同的hashCode相同的對象。 但是這個實現允許添加重複的鍵並且爲邏輯上相同的鍵回退null。 在另一方面,當:

的hashCode = 1,@覆蓋equals()方法

它工作得很好。 我很難弄清楚在這兩種情況下發生了什麼。

+1

如果一切都有散列碼1,那麼這是一個有效但可怕的散列碼,因爲該類型的所有內容都將始終落入同一個散列桶中。 – khelwood

+0

你確定嗎?平等是如何實施的,這沒有什麼區別嗎? – jarosik

+1

'hashCode'是確定兩個對象是否*不相等的快速方法:如果它們的'hashCode'不匹配,則說明它們不可能相等;然而,這沒有說明他們*是否相等。 –

回答

5

假設您要求將您的課程用作HashMap中的密鑰。

在第一種情況下,由於equals未被覆蓋,因此a.equals(b)當且僅當a==b。因此,這個實現允許「邏輯」重複,因爲兩個不同的實例對於它們的所有屬性可以具有完全相同的值,但是它們仍然不被認爲是彼此相等的。

在第二種情況下,當equals被覆蓋時,您的實現將確定相同類的兩個對象何時彼此相等。

這兩種情況不違反hashCode合同,但由於hashCode總是返回1,這兩個國家都在HashMap或作爲HashSet元素作爲重點服務的時候,因爲所有的鍵將被映射到相同的糟糕表現bin,並且HashMap\HashSet將變成LinkedList