hashCode()和equals()重写实际上是如何工作的?
问题描述:
我刚刚从一本书中读到,它表示只要我们覆盖Object对象的equals()
方法,它的hashCode()
方法也应该被覆盖,但我不明白为什么我们也必须重写hashCode()
方法。让我们考虑以下下面的例子:hashCode()和equals()重写实际上是如何工作的?
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
,那么也应该是true
。
您可能想要了解基于散列的数据结构以更详细地了解此需求,例如:https://en.wikipedia.org/wiki/Hash_table