情况
我需要覆盖equals(),因为我建议我也hashCode()使用相同的字段覆盖该方法.然后,当我看着一个只包含一个对象的集合时,我得到了令人沮丧的结果
set.contains(object)
=> false
Run Code Online (Sandbox Code Playgroud)
而
set.stream().findFirst().get().equals(object)
=> true
Run Code Online (Sandbox Code Playgroud)
我现在明白了,这是由于object在添加后set再次更改其hashCode 所做的更改.contains然后查看错误的密钥,找不到object.
我对实施的要求是
equals()Collections或Maps灰尘HashSet.这违反了惯例
equals()并且hashCode()应该使用相同的字段以避免意外(如此处所述:https://stackoverflow.com/a/22827702).题
是否存在使用仅用于equals()计算hashCode()而不是全部使用的字段子集的危险?
更具体而言,这将意味着:equals()使用大量的物体的领域的,而hashCode()仅使用在所使用的那些字段equals()和是不可变的.
我认为这应该没问题,因为
HashSet在这些更改之前和之后找到.相关帖子帮助我理解了我的问题,但没有解决方法:在Java中覆盖equals和hashCode时应该考虑哪些问题?和equals和hashcode的不同字段