equals 为 true,但 hashCode 不同,这种说法对吗?
查看完整题解
参考回答
直接回答
对遵守约定的实现来说,不对。若 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 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。