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)都依赖于这两种方法的一致性。实际上,对于两个对象ab,如果a.equals(b)true,那么也应该是true

您可能想要了解基于散列的数据结构以更详细地了解此需求,例如:https://en.wikipedia.org/wiki/Hash_table