2017-06-19 107 views
0

我剛剛從一本書中讀到,它表示只要我們覆蓋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()?謝謝!

回答

0

重寫equals()hashCode()這是一個慣例。原因是許多庫工具(如HashMap)都依賴於這兩種方法的一致性。實際上,對於兩個對象ab,如果a.equals(b)true,那麼也應該是true

您可能想要了解基於散列的數據結構以更詳細地瞭解此需求,例如:https://en.wikipedia.org/wiki/Hash_table

相關問題