2017-01-12 5 views
-1

私はオブジェクトに設定され保存されますと、私は特定のオブジェクトを見つけたい、この場合には、なぜ私はハッシュコードをオーバーライドする必要がないと私は、彼らが言っている いつhashcodeとequalsメソッドが必要ですか?

例以下
public class Emp 
{ 
    private int age ; 

    public Emp(int age) 
    { 
     super(); 
     this.age = age; 
    } 

    public int hashCode() 
    { 
     return age; 
    } 

    public boolean equals(Object obj) 
    { 
     boolean flag = false; 
     Emp emp = (Emp)obj; 
     if(emp.age == age) 
      flag = true; 
     return flag; 
    } 
} 

から読み取る方法に等しいHashSetののファレを持っています私はhashcodeとequalsメソッドをオーバーライドしないと、私は以下のクエリでfalseになるだろう。

System.out.println("HashSet Size--->>>"+hs.size()); 
System.out.println("hs.contains(new Emp(25))--->>>"+hs.contains(new Emp(25))); 
System.out.println("hs.remove(new Emp(24)--->>>"+hs.remove(new Emp(24)); 
System.out.println("Now HashSet Size--->>>"+hs.size()); 

私は、これはハッシュコードに関連する方法を混同し、ちょうど含まれている(ANYOBJECT)をチェック等しく、HashSetの中で(ANYOBJECT)を削除しました。

誰かが私に上記のシナリオを説明できますか?

+3

可能な重複:https://stackoverflow.com/questions/2265503/why-do-i-need-to-override-the-equals-and-hashcode-methods-in-java?rq=1 –

+0

なぜあなたはどちらか一方を無効にする必要があるのか​​、両方を無効にする必要があるのか​​を尋ねます。後者の場合:http://stackoverflow.com/questions/2265503/why-do-i-need-to-override-the-equals-and-hashcode-methods-in-java – yshavit

+1

コンテナは、 2つのものが等しいかどうかを判断できない場合は、何かが含まれていますか?同様に、あなたはそれを行う方法を教えていない場合、物事が等しいかどうかを知ることはどうしたらよいでしょうか? – azurefrog

答えて

4

あなたの混乱の根底には、アイデンティティと同値のコンセプトがあります。セットに要素が含まれているとはどういう意味ですか?説明しようとしましょう。

は、あなたがこの行っているあなたのコード内のいくつかの場所でと仮定します。いくつかの他の場所では

HashSet<Emp> hs = new HashSet<>(); 
hs.add(new Emp(32)); 

を、あなたは32歳のための従業員がセットにあるかどうかを見てみたいです。どうしますか?あなたはコンストラクタに32を渡すEmpのインスタンスを作成し、その後contain()にインスタンスを渡して、ここで何をやっている

boolean isThere = hs.contains(new Emp(32)); 

:あなたは、この検討することができます。

このインスタンスは、セットに追加したときに作成したインスタンスと同じインスタンスではありません。したがって、問題は:は、このインスタンスが追加したものと同一であるか、まったく同じインスタンスではないため、falseを返すべきであるため、trueを返す必要がありますか?

結果は、EmpにどのようにhashCode()equals()が実装されているかによって異なります。デフォルト実装の場合、equals()は、渡されたインスタンスが含まれているインスタンスと同じものである場合にのみtrueを返します(つまり、==を使用して、に渡されたインスタンスと格納されたインスタンスを比較します)。この場合は、falseが返されます。

hashCode()を理解するには、HashSetの仕組みを理解する必要があります。 HashSetに要素を追加すると、配列内のインデックスは、hashCode() % <size of the array>を使用して要素から計算されます。この要素は、対応するインデックスに値として設定されます。

異なる要素が同じhashCode()になる可能性があるため、同じインデックスでより多くの要素をマッピングすることができます。この場合、衝突のリストが維持されます。

あなたのケースに戻って、なぜhashCode()を実装する必要がありますか?デフォルトの実装ではEntの異なるインスタンスに対して異なる番号が返されるため、ageは同じでも構いません(実装はJVMに依存します。たとえば、インスタンスのメモリ内のアドレスを返す可能性があります)。したがって、包含関係が機能するには、配列内の同じインデックスが2つのインスタンスに対して計算されていることを確認する必要があります。したがって、それに応じて実装する必要があります。たとえば、この場合、hashCode()は年齢自体を返す可能性があります。

関連する問題