热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hashCode()只应使用equals()中使用的不可变字段的子集吗?

如何解决《hashCode()只应使用equals()中使用的不可变字段的子集吗?》经验,您有什么比较好的解决方法?

情况

我需要覆盖equals(),因为我建议我也hashCode()使用相同的字段覆盖该方法.然后,当我看着一个只包含一个对象的集合时,我得到了令人沮丧的结果

set.contains(object)
=> false

set.stream().findFirst().get().equals(object)
=> true

我现在明白了,这是由于object在添加后set再次更改其hashCode 所做的更改.contains然后查看错误的密钥,找不到object.

我对实施的要求是

需要可变字段才能正确实现 equals()

即使它们容易发生变化,也可以安全地使用这些对象基于散列CollectionsMaps灰尘HashSet.

这违反了惯例

equals()并且hashCode()应该使用相同的字段以避免意外(如此处所述:https://stackoverflow.com/a/22827702).

是否存在使用仅用于equals()计算hashCode()而不是全部使用的字段子集的危险?

更具体而言,这将意味着:equals()使用大量的物体的领域的,而hashCode()仅使用在所使用的那些字段equals()和是不可变的.

我认为这应该没问题,因为

该合同是fullfilled:相等的对象会产生相同的hashCode,而相同的hashCode并不necesairly意味着对象是相同的.

即使对象暴露于更改,对象的hashCode也保持不变,因此可以HashSet在这些更改之前和之后找到.

相关帖子帮助我理解了我的问题,但没有解决方法:在Java中覆盖equals和hashCode时应该考虑哪些问题?和equals和hashcode的不同字段


推荐阅读
author-avatar
零摄氏度玫瑰_460
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有