2017-06-19 5 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のような多くのライブラリユーティリティが両方のメソッドの一貫性に依存しているからです。実際、2つのオブジェクトabの場合、a.equals(b)trueの場合、a.hashCode() == b.hashCode()trueである必要があります。

ハッシュベースのデータ構造について詳しくは、次のURLを参照してください。https://en.wikipedia.org/wiki/Hash_table

関連する問題