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

hashCode() 和 equals() 为什么重要?

查看完整题解

参考回答

直接回答

equals() 定义两个对象在业务上是否相等,hashCode() 帮助哈希容器缩小查找范围。它们必须遵守同一条约定:如果两个对象 equals() 为 true,hashCode() 就必须相同;哈希值相同的对象则未必相等。重写 equals() 时通常也必须重写 hashCode()。

讲清原理

HashMap 查找键时会先利用哈希信息定位候选位置,再判断键是否匹配。可以把它理解为“先找书架,再核对书名”。如果两个逻辑相等的键被算到不同位置,容器可能找不到已存在的条目,或产生逻辑上的重复键。

这条约定要求一致性,不要求所有不同对象都拥有不同哈希值。碰撞是允许的,只是碰撞过多可能影响性能。还应避免修改已经作为键使用的对象中参与相等判断的字段,否则后来查找时算出的范围可能改变。

值相等的键必须进入同一个哈希候选范围
值相等的键必须进入同一个哈希候选范围

例子与易错点

record UserKey(long id) {}
var map = new java.util.HashMap<UserKey, String>();
map.put(new UserKey(7), "小林");
System.out.println(map.get(new UserKey(7))); // 小林

record 会根据组件生成配套的 equals 和 hashCode。不要把 hashCode 当成对象地址、唯一编号或跨进程稳定标识。

相关题:第 11 题、第 37 题、第 39 题、第 57 题。

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

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