面试tips--java--equals() hashCode()
1.
equals()
方法
作用:用于比较两个对象的 内容是否相等。
默认实现:在
Object
类中,equals()
默认使用 ==,比较的是对象的 内存地址(即是否为同一个对象)。常见重写场景:当我们希望比较对象的“内容”而不是“地址”时,就需要重写
equals()
方法。
比如
String
类就重写了equals()
,所以new String("abc").equals(new String("abc"))
会返回true
,即使它们不是同一个对象。例子:
public class Person {private String name;private int age;@Overridepublic boolean equals(Object o) {if (this == o) return true; // 内存地址相同,直接trueif (o == null || getClass() != o.getClass()) return false; // 类型不同直接falsePerson person = (Person) o;return age == person.age && name.equals(person.name); // 内容比较} }
2.
hashCode()
方法
作用:返回对象的 哈希值(
int
类型),主要用于 哈希结构的集合(如HashMap
、HashSet
、Hashtable
等)。哈希表存储原理:
插入对象时,先计算对象的
hashCode()
。用
hashCode()
定位到某个“桶”(bucket)。如果桶中有多个对象,再用
equals()
判断对象是否相同。默认实现:在
Object
类中,hashCode()
会根据对象的内存地址计算,因此不同对象一般哈希值不同。例子:
public class Person {private String name;private int age;@Overridepublic int hashCode() {return name.hashCode() + age;} }
3. 为什么重写
equals()
必须重写hashCode()
?3.1 Java 规定
Java 规定了
equals()
与hashCode()
的 契约:
如果两个对象
equals()
返回true
,那么它们的hashCode()
必须相等。如果两个对象
equals()
返回false
,它们的hashCode()
可以相等(但最好减少冲突)。3.2 原因
如果只重写了
equals()
,没重写hashCode()
,可能导致集合中找不到对象。示例:
Person p1 = new Person("Tom", 18); Person p2 = new Person("Tom", 18);HashSet<Person> set = new HashSet<>(); set.add(p1);System.out.println(set.contains(p2));
如果 只重写了
equals()
:
p1.equals(p2)
为true
(内容相等)。但
p1.hashCode()
和p2.hashCode()
不同(因为默认按内存地址算)。HashSet 会认为它们在不同的桶中 →
contains(p2)
返回false
❌。如果 同时重写了
equals()
和hashCode()
:
哈希值相同,定位到同一个桶。
再用
equals()
比较内容 → 找到对象 →contains(p2)
返回true
✅。
4. 正确的重写方式
推荐使用 IDE 自动生成,例如 IntelliJ IDEA/ Eclipse 可以自动生成基于字段的
equals()
和hashCode()
。示例(推荐写法):
import java.util.Objects;public class Person {private String name;private int age;@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age && Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);} }
5. 总结
equals()
:比较对象的内容是否相等。
hashCode()
:返回对象的哈希值,用于哈希集合快速查找。必须遵守契约:
equals()
相等 →hashCode()
必须相等。否则哈希集合(HashMap/HashSet)会出现“存了却找不到”的问题。
正确姿势:重写
equals()
时,一定要重写hashCode()
。