2014-08-27 112 views
1

在SCJP書有一個表SCJP hashCode()和equals()方法混淆

enter image description here

我迷惑的最後一行。如果x.hashCode()! = y.hasCode()比爲什麼是ut「必需」即x.equals(y)== false

因爲從我的理解,如果HashCodes是不同的,會有不同的桶,並從它找到對象不會產生問題,而不是爲什麼「x.equals(y)== false」需要?

讓我們假設x.hashCode()! = y.hashCode()。和x.equals(y) == true.

當我檢索或添加對象從或映射或設置它有什麼區別?

任何示例都會被讚賞。

+0

這對hashCode()和equals(Object)的所有實現都是必需的。 – Raedwald 2014-08-27 11:39:55

回答

1

這是爲了當您爲自己的類實現自定義hashCodeequals方法時,它是您需要遵守的合約,以便在Java中實現哈希和對象相等性測試。他們提到的是,在本書,因爲它是可能的,在自己的實現違反這些合同在自己的自定義hashCodeequals方法

你所談論的條件是x.equals(y) == true的直接結果意味着x.hashCode() == y.hashCode()(在第一行的表)

P意味着Q)是一樣的東西(not Q意味着not P),P從第一排在教科書表是x.equals(y) == true,和Q是x.hashCode() == y.hashCode()

+0

hummmmmm ........ – KSHiTiJ 2014-08-27 11:00:48

+0

從HashCode()它的好,但從​​等於()違反合同。 – KSHiTiJ 2014-08-27 11:08:58

0

哈希碼是爲了加快搜索速度。如果您有a.equals(b) == truea.hashCode() != b.hashCode(),那麼使用散列的容器將找不到散列容器找不到的結果以及其他問題。

最後一行是第一行的對位。

+0

「使用哈希的容器找不到某些結果」。我有上面的場景運行良好的程序。但我也同意我必須遵守合同。 – KSHiTiJ 2014-08-27 11:05:48

+1

你的程序只適用於哈希表的某些實現。例如,如果哈希表緩存最後訪問的元素,那麼如果'a.equals(b)&& a.hashCode()!= b.hashCode()'那麼如果最後訪問的元素是a並且您搜索b,則它會返回一個而不是b。 – programmerjake 2014-08-27 11:10:40

+0

同意......... – KSHiTiJ 2014-08-27 11:13:18

相關問題