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() 可相同也可不同——但分布越均匀,哈希表性能越好。
重写 equals 时务必重写 hashCode
IDE(如 IntelliJ 或 Eclipse)通常能自动生成两者,但需确认逻辑匹配。常见错误包括:
- 只重写了
equals(),忘记重写hashCode() -
hashCode()基于未参与equals()比较的字段计算 -
hashCode()使用了可变字段(如普通 setter 修改的属性),而equals()也依赖它——这会破坏一致性
推荐使用 Objects.hash(field1, field2, ...) 生成简洁可靠的哈希码。
不可变类与 null 安全处理
若类字段可能为 null,在 hashCode() 中应避免直接调用 null.hashCode()。可用 Objects.hashCode(obj) 安全处理(对 null 返回 0)。
对于不可变类(字段 final 且无 setter),hashCode() 可在构造时计算并缓存,提升性能;但注意:首次访问才计算,避免构造开销。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











