“相同对象”可能有不同的 hashCode 吗?
先说出你的答案
定义边界、关键机制、一个反例;P8题再补容量、失败与验证。
查看完整题解
参考回答
直接回答
先明确“相同”是什么意思。如果两个对象按 equals() 判断相等,合规实现必须让它们的 hashCode 相同。如果指同一个对象在不同时间被修改,相等性相关状态变化后,哈希值可以变化;如果比较不同运行过程,也不能无条件要求数值不变。
讲清原理
题目把对象身份、逻辑相等和时间混在了一起。两个内容相同但不是同一实例的值对象,也需要遵守 equals/hashCode 约定。若一个类只重写 equals,却继承不匹配的 hashCode,程序可能违约,不是语言规则允许它随便返回不同值。
对同一对象,一致性要求有一个前提:参与 equals 判断的信息没有改变。可变键被放入 HashMap 后又改变这些信息,可能让它在错误的候选位置上“失联”。
例子与易错点
record Key(int id) {}
var x = new Key(1);
var y = new Key(1);
System.out.println(x.equals(y)); // true
System.out.println(x.hashCode() == y.hashCode()); // true
面试时先说明比较的是“同一时刻的逻辑相等”,再给结论,比直接回答“永远不能”更准确。
相关题:第 11 题、第 37 题、第 57 题。
和评分标准对照,你能独立回答到哪一步?
自评会安排下一次复习,不保存你的口述内容。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。