hashCode() 和 equals() 覆盖实际上是如何工作的



我刚刚从一本书中读到,它说只要我们从 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(依赖于这两种方法的一致性。事实上,对于ab两个对象,如果a.equals(b)true,那么a.hashCode() == b.hashCode()也应该是true

您可能需要阅读有关基于哈希的数据结构的信息,以更详细地了解此要求,例如,此处:https://en.wikipedia.org/wiki/Hash_table

相关内容

  • 没有找到相关文章

最新更新