在Java中,如果你重写了equals()
方法,就必须重写hashCode()
方法,这是因为在Java的集合框架(如HashMap
、HashSet
等)中,hashCode()
和equals()
方法是紧密相关的,遵循以下两个重要的规则:
1.相等对象必须具有相等的哈希码:如果根据equals()
方法,两个对象是相等的,那么它们的hashCode()
也必须相等。否则,这些对象在基于哈希的集合(如HashSet
、HashMap
)中会表现出不可预期的行为,例如两个相等的对象可能会存储在集合的不同位置,从而导致数据丢失或无法正确检索。
2.不相等的对象不需要有不同的哈希码:虽然这不是强制要求的,但如果两个不相等的对象有不同的哈希码,可以提高哈希表的性能,因为这会减少哈希冲突。
举个例子:
假设你有一个自定义类Person
,并且你重写了equals()
方法以根据name
属性来比较对象:
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
// 这个检查用于比较当前对象和传入对象的类是否相同。getClass() 方法返回当前对象的运行时类。
// 如果当前对象 this 和传入对象 o 不属于同一个类(即它们的运行时类不同),那么这两个对象不可能相等,所以返回 false
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return name.equals(person.name);
}
@Override
public int hashCode() {
return name.hashCode();
}
}
在上面的例子中,我们重写了equals()
方法来比较Person
对象的name
属性,并相应地重写了hashCode()
方法,使其基于name
的哈希码。
假如没有重写hashcode方法
当你将Person
对象添加到HashSet
或用作HashMap
的键时,即使两个对象根据equals()
方法被认为是相等的,它们也可能具有不同的哈希码。这会导致HashSet
中存储重复对象,或者HashMap
无法正确检索键值。因此,重写equals()
方法后必须重写hashCode()
方法,以确保对象在基于哈希的集合中能够正确工作。