Java中hashCode()必须与equals()保持一致:若equals()为true,则hashCode()必须相同;同一对象多次调用hashCode()结果需一致;重写equals时必须重写hashCode,推荐用Objects.hash()并注意null安全与不可变类缓存。

Java 中 hashCode() 方法必须与 equals(Object) 保持一致:如果两个对象通过 equals() 判定为相等,它们的 hashCode() 值必须相同;反之则不要求。
hashCode 与 equals 的核心契约
这是 Java 规范明确规定的约束,直接影响基于哈希的数据结构(如 HashMap、HashSet)的正确性。若违反,会导致:
- 相同对象被重复添加到
HashSet中 -
HashMap查不到已存在的键,即使equals()返回true - 集合行为不可预测,调试困难
必须遵守的三条规则
一致性:同一对象在执行期间多次调用 hashCode(),只要其用于 equals() 比较的字段未改变,返回值必须相同。
相等性要求:对任意非空引用 a 和 b,若 a.equals(b) == true,则 a.hashCode() == b.hashCode() 必须成立。
非相等不强制:若 a.equals(b) == false,hashCode() 可相同也可不同——但分布越均匀,哈希表性能越好。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
重写 equals 时务必重写 hashCode
IDE(如 IntelliJ 或 Eclipse)通常能自动生成两者,但需确认逻辑匹配。常见错误包括:
- 只重写了
equals(),忘记重写hashCode() -
hashCode()基于未参与equals()比较的字段计算 -
hashCode()使用了可变字段(如普通 setter 修改的属性),而equals()也依赖它——这会破坏一致性
推荐使用 Objects.hash(field1, field2, ...) 生成简洁可靠的哈希码。
立即学习“Java免费学习笔记(深入)”;
不可变类与 null 安全处理
若类字段可能为 null,在 hashCode() 中应避免直接调用 null.hashCode()。可用 Objects.hashCode(obj) 安全处理(对 null 返回 0)。
对于不可变类(字段 final 且无 setter),hashCode() 可在构造时计算并缓存,提升性能;但注意:首次访问才计算,避免构造开销。

















