📌 专栏 :大白话说Java面试题 --- 01-Java基础篇
第38题:两个对象的hashCode()相同,则 equals()是否也一定为 true?
📚 回答:
- 核心概念 :
在 Java 中,hashCode()和equals()是两个重要的方法,它们之间的关系遵循以下规则:- 如果两个对象通过
equals()方法比较为true,那么它们的hashCode()必须相等。 - 如果两个对象的
hashCode()相同,它们通过equals()比较的结果不一定为true。
- 如果两个对象通过
1. 原因分析
-
哈希冲突:
hashCode()的返回值是一个整数,而整数的范围是有限的(32位)。因此,在大量对象中,可能会出现不同的对象生成相同的hashCode()值,这就是哈希冲突。- 即使两个对象的
hashCode()相同,它们的内容(由equals()定义)可能完全不同。
-
规范要求:
- Java 规范要求:如果两个对象通过
equals()比较为true,它们的hashCode()必须一致;但反之则不一定成立。
💡 代码示例 :
以下代码展示了
hashCode()相同但equals()不同的情况: - Java 规范要求:如果两个对象通过
java
class Person {
private String name;
public Person(String name) {
this.name = name;
}
@Override
public int hashCode() {
return 1; // 强制所有对象返回相同的哈希值
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return name.equals(person.name);
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person("Alice");
Person p2 = new Person("Bob");
System.out.println(p1.hashCode() == p2.hashCode()); // 输出 true
System.out.println(p1.equals(p2)); // 输出 false
}
}
💡 面试官视角:
- 面试官可能会问"为什么需要重写
hashCode()和equals()?"答:为了保证集合类(如HashMap、HashSet)的正确性,避免因为哈希冲突导致数据存储或查找失败。 - 面试官可能会追问"如何正确重写
hashCode()和equals()?"答:可以使用 IDE 自动生成工具,或者手动基于对象的关键属性实现一致性逻辑。