SCJP hashCode()和equals()方法混淆

问题描述:

在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

这是为了当您为自己的类实现自定义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

哈希码是为了加快搜索速度。如果您有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