电话
400 9058 355
重写 equals() 时必须同步重写 hashCode(),且两者依据的字段严格一致;否则 HashMap、HashSet 等集合行为异常。推荐用 Objects.hash() 生成 hashCode,避免手工计算。
这是 Java 规范强制要求的“黄金法则”:如果 equals() 判断两个对象逻辑相等,那它们的 ha 值必须完全一致。否则,像 
HashMap、HashSet 这类哈希集合会直接失效——对象明明该被查到,却永远找不到。
HashSet 里加了对象 A,再用内容相同的对象 B 调用 contains(B),结果返回 false
hashCode() 和 A 不同,导致哈希表去错了“桶”,压根没走到 equals() 比较那一步hashCode() 相等,equals() 不一定为 true(允许哈希冲突)很多开发者改了 equals(),却忘了同步更新 hashCode(),结果埋下隐蔽 bug。因为 Object 默认的 hashCode() 基于内存地址,而你重写的 equals() 已经按业务字段(比如 id、name)判断相等,两者彻底脱节。
equals() 比较 id,但没重写 hashCode() → 两个 id 相同的 User 实例,hashCode() 却不同HashMap 的 key 时,第二次 put() 会新增 entry 而非覆盖;get() 也取不到值equals(),就立刻重写 hashCode(),且两者依据的字段必须严格一致手写 hashCode() 不必追求完美散列,关键是稳定、一致、基于 equals() 所用字段。JDK 自带的 Objects.hash(...) 是最稳妥的选择。
return Objects.hash(id, name, age); —— 字段顺序和 equals() 中的判等顺序保持一致id * 31 + name.hashCode() * 7 这种易错、难维护的手工计算equals() 判等的字段没变,hashCode() 就不能变;可变字段(如临时状态)绝不能参与计算不是所有类都需要重写。只有当你明确需要“内容相等”语义,并且对象会进入哈希集合或作为 Map 键使用时,才必须动手。
立即学习“Java免费学习笔记(深入)”;
HashMap 的 key、放进 HashSet 去重、缓存 key → 必须检查是否已重写二者equals() 和 hashCode(),比手写更可靠真正容易被忽略的是:即使你用了 Lombok 的 @EqualsAndHashCode,也要确认它选中的字段和业务判等逻辑一致——比如是否误包含了数据库自增主键、时间戳这类可能变化的字段。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...