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

hashCode() 有什么用,与 equals() 有什么关系?

先说出你的答案

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

查看完整题解

参考回答

直接回答

hashCode() 返回一个 int 类型的哈希值,供 HashMap、HashSet 等哈希结构使用。它与 equals() 的核心约定是:在相关状态没有改变的前提下,相等对象必须给出相同哈希值;不同对象可以发生碰撞。哈希值不是身份证,不要求全局唯一。

讲清原理

equals 回答“这是不是我找的那个逻辑值”,hashCode 帮助回答“先去哪个候选区域找”。把两者搭配使用,既要保证结果正确,也希望把不同的键较均匀地分散开。

同一个对象的相等性相关字段发生变化后,哈希值可能变化。因此,拿可变对象作键时要格外小心。反过来,即使一个 hashCode 总返回常数,也可能满足基本正确性约定,只是会把大量对象挤到同一候选范围,影响性能。

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

例子与易错点

String a = new String("key");
String b = new String("key");
System.out.println(a.equals(b)); // true
System.out.println(a.hashCode() == b.hashCode()); // true

hashCode 的一致性通常针对同一次程序执行中的有关状态,不是“任何对象在所有机器、所有运行中都得到同一个稳定业务编号”。需要业务标识时应明确设计字段。

相关题:第 5 题、第 11 题、第 39 题、第 41 题、第 57 题。

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

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