在SCJP Book中有一个表
我在Last Row上感到困惑。如果x.hashCode()! = y.hasCode()
比“必需”那样 x.equals(y)== false 。
因为根据我的理解,如果HashCodes不同,会有不同的存储桶,并且从中找到Object不会产生问题,而不是“x.equals(y)== false”需要吗?
让我们假设x.hashCode()! = y.hashCode()
。并x.equals(y) == true.
从Or To Map OR Set中检索或添加对象时是否有任何区别。?
任何例子都会受到赞赏。
答案 0 :(得分:1)
这适用于为自己的类实现自定义hashCode
和equals
方法的情况,它是您需要尊重的合同,以便在Java中实现散列和对象相等性测试。他们在本书中提到了这一点,因为在您自己的实施中,您可以使用自己的自定义hashCode
和equals
方法违反这些合同
您所谈论的条件是x.equals(y) == true
暗示x.hashCode() == y.hashCode()
(表格第一行)的直接结果
(P
暗示Q
)与(not Q
隐含not P
)相同,P是该教科书表第一行的x.equals(y) == true
,Q为x.hashCode() == y.hashCode()
答案 1 :(得分:0)
哈希码旨在加快搜索速度。如果你有a.equals(b) == true
和a.hashCode() != b.hashCode()
那么使用散列的容器将找不到一些没有散列的容器会找到的结果,以及其他问题。
最后一行也是第一行的对立面。