我刚刚从一本书中读到,它说只要我们从 Object 类中重写equals()
方法,它的hashCode()
方法也应该被覆盖,但我真的不明白为什么我们还必须覆盖 hashCode()
方法。让我们考虑下面的一个例子:
public class Employee {
public int employeeId;
public String firstName, lastName;
public int yearStarted;
Employee(){}
Employee(int employeeID){
this.employeeId = employeeID;
}
// @Override
// public int hashCode() {
// return employeeId;
// }
public boolean equals(Object e) {
if(!(e instanceof Employee)){
return false;
}
else {
Employee newEmp = (Employee)e;
return this.employeeId == newEmp.employeeId;
}
}
public static void main(String[] args) {
Employee one = new Employee(101);
if (one.equals(new Employee(101)))
System.out.println("Success");
else
System.out.println("Failure");
}
}
运行时,我得到">成功"结果,而我只覆盖了一个equals()
,而不是hashCode()
。那么,在覆盖equals()
方法时,与hashCode()
相关的流程实际上是什么样子的,在这种情况下,我们需要同时覆盖hashCode()
和equals()
?谢谢!
覆盖equals()
和hashCode()
是一种约定。原因是许多库实用程序(如HashMap
(依赖于这两种方法的一致性。事实上,对于a
和b
两个对象,如果a.equals(b)
是true
,那么a.hashCode() == b.hashCode()
也应该是true
。
您可能需要阅读有关基于哈希的数据结构的信息,以更详细地了解此要求,例如,此处:https://en.wikipedia.org/wiki/Hash_table