作者:零摄氏度玫瑰_460 | 来源:互联网 | 2023-01-17 23:19
情况
我需要覆盖equals()
,因为我建议我也hashCode()
使用相同的字段覆盖该方法.然后,当我看着一个只包含一个对象的集合时,我得到了令人沮丧的结果
set.contains(object)
=> false
而
set.stream().findFirst().get().equals(object)
=> true
我现在明白了,这是由于object
在添加后set
再次更改其hashCode 所做的更改.contains
然后查看错误的密钥,找不到object
.
我对实施的要求是
需要可变字段才能正确实现 equals()
即使它们容易发生变化,也可以安全地使用这些对象基于散列Collections
或Maps
灰尘HashSet
.
这违反了惯例
equals()
并且hashCode()
应该使用相同的字段以避免意外(如此处所述:https://stackoverflow.com/a/22827702).
题
是否存在使用仅用于equals()
计算hashCode()
而不是全部使用的字段子集的危险?
更具体而言,这将意味着:equals()
使用大量的物体的领域的,而hashCode()
仅使用在所使用的那些字段equals()
和是不可变的.
我认为这应该没问题,因为
该合同是fullfilled:相等的对象会产生相同的hashCode,而相同的hashCode并不necesairly意味着对象是相同的.
即使对象暴露于更改,对象的hashCode也保持不变,因此可以HashSet
在这些更改之前和之后找到.
相关帖子帮助我理解了我的问题,但没有解决方法:在Java中覆盖equals和hashCode时应该考虑哪些问题?和equals和hashcode的不同字段