我刚从一本书中读到并说它只要我们从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()
。那么当覆盖hashCode()
方法实际上看起来与equals()
相关的流程是什么样的,在哪种情况下我们需要覆盖hashCode()
和equals()
?谢谢!
答案 0 :(得分:0)
覆盖equals()
和hashCode()
是一种惯例。原因是许多库实用程序(例如HashMap
)依赖于两种方法的一致性。事实上,对于两个对象a
和b
,如果a.equals(b)
为true
,则a.hashCode() == b.hashCode()
也应为true
。
您可能希望阅读有关基于哈希的数据结构以更详细地了解此要求,例如:https://en.wikipedia.org/wiki/Hash_table