已經有 我已經看到了很多關於Java中所有影響不重寫的hashCode問題,我得到它, 但在這種稍有不同的情況下會發生什麼:不清楚合同的hashCode違反
的hashCode = 1且等於未被覆蓋。
HashCode合同似乎沒有被違反 - 我們返回相同的hashCode相同的對象。 但是這個實現允許添加重複的鍵並且爲邏輯上相同的鍵回退null。 在另一方面,當:
的hashCode = 1,@覆蓋equals()方法
它工作得很好。 我很難弄清楚在這兩種情況下發生了什麼。
已經有 我已經看到了很多關於Java中所有影響不重寫的hashCode問題,我得到它, 但在這種稍有不同的情況下會發生什麼:不清楚合同的hashCode違反
的hashCode = 1且等於未被覆蓋。
HashCode合同似乎沒有被違反 - 我們返回相同的hashCode相同的對象。 但是這個實現允許添加重複的鍵並且爲邏輯上相同的鍵回退null。 在另一方面,當:
的hashCode = 1,@覆蓋equals()方法
它工作得很好。 我很難弄清楚在這兩種情況下發生了什麼。
假設您要求將您的課程用作HashMap
中的密鑰。
在第一種情況下,由於equals
未被覆蓋,因此a.equals(b)
當且僅當a==b
。因此,這個實現允許「邏輯」重複,因爲兩個不同的實例對於它們的所有屬性可以具有完全相同的值,但是它們仍然不被認爲是彼此相等的。
在第二種情況下,當equals
被覆蓋時,您的實現將確定相同類的兩個對象何時彼此相等。
這兩種情況不違反hashCode
合同,但由於hashCode
總是返回1,這兩個國家都在HashMap
或作爲HashSet
元素作爲重點服務的時候,因爲所有的鍵將被映射到相同的糟糕表現bin,並且HashMap\HashSet
將變成LinkedList
。
如果一切都有散列碼1,那麼這是一個有效但可怕的散列碼,因爲該類型的所有內容都將始終落入同一個散列桶中。 – khelwood
你確定嗎?平等是如何實施的,這沒有什麼區別嗎? – jarosik
'hashCode'是確定兩個對象是否*不相等的快速方法:如果它們的'hashCode'不匹配,則說明它們不可能相等;然而,這沒有說明他們*是否相等。 –