SCJP hashCode()和equals()方法混淆
在SCJP书有一个表SCJP hashCode()和equals()方法混淆
我迷惑的最后一行。如果x.hashCode()! = y.hasCode()
比为什么是ut“必需”即x.equals(y)== false。
因为从我的理解,如果HashCodes是不同的,会有不同的桶,并从它找到对象不会产生问题,而不是为什么“x.equals(y)== false”需要?
让我们假设x.hashCode()! = y.hashCode()
。和x.equals(y) == true.
当我检索或添加对象从或映射或设置它有什么区别?
任何示例都会被赞赏。
这是为了当您为自己的类实现自定义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()
哈希码是为了加快搜索速度。如果您有a.equals(b) == true
和a.hashCode() != b.hashCode()
,那么使用散列的容器将找不到散列容器找不到的结果以及其他问题。
最后一行是第一行的对位。
“使用哈希的容器找不到某些结果”。我有上面的场景运行良好的程序。但我也同意我必须遵守合同。 – KSHiTiJ 2014-08-27 11:05:48
你的程序只适用于哈希表的某些实现。例如,如果哈希表缓存最后访问的元素,那么如果'a.equals(b)&& a.hashCode()!= b.hashCode()'那么如果最后访问的元素是a并且您搜索b,则它会返回一个而不是b。 – programmerjake 2014-08-27 11:10:40
同意......... – KSHiTiJ 2014-08-27 11:13:18
这对hashCode()和equals(Object)的所有实现都是必需的。 – Raedwald 2014-08-27 11:39:55