Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

equals 为 true,但 hashCode 不同,这种说法对吗?

先说出你的答案

定义边界、关键机制、一个反例;P8题再补容量、失败与验证。

查看完整题解

参考回答

直接回答

对遵守约定的实现来说,不对。若 x.equals(y) 为 true,x.hashCode() 与 y.hashCode() 就必须相等。程序当然可以写出违反约定的方法,但那属于实现错误,不能把它当成 Java 允许的正常语义。

讲清原理

这里的“值相同”应明确为 equals 定义的相等,而不是“某几个字段看起来相同”。一个类如果没有重写 equals,不同实例即使字段值一样,也可能仍被判为不相等。

如果重写 equals 却没有匹配的 hashCode,HashSet 可能无法按预期去重,HashMap 也可能找不到逻辑相等的键。这些结果与哈希候选定位机制有关,不是简单说“equals 没生效”。

例子与易错点

record Id(long value) {}
var x = new Id(9);
var y = new Id(9);
var set = new java.util.HashSet<Id>();
set.add(x);
set.add(y);
System.out.println(set.size()); // 1

反过来,hashCode 相同不能推出 equals 为 true。答题时把这两个方向分开,才不会把哈希碰撞与违约混成一回事。

相关题:第 5 题、第 11 题、第 39 题、第 40 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。