1

2 つの型がAありB、両方に一意のidフィールドがあるとします。通常、 equals() および hashCode() メソッドを実装する方法は次のとおりです。

@Override
public boolean equals(Object obj) {
    return obj instanceof ThisType && obj.hashCode() == hashCode();
}

@Override
public int hashCode() {
    return Arrays.hashCode(new Object[] { id });
}

その場合、AB両方がそれぞれidのフィールドを設定する 1 引数のコンストラクターを持っていることを考えると、

new A(1).equals(new A(1)) // prints true as expected,
new A(1).equals(new A(2)) // prints false as expected,
new A(1).equals(new B(1)) // prints false as expected.

だけでなく、

new A(1).hashCode() == new B(1).hashCode() // prints true.

2 つのオブジェクトが同じ型でなくても、2 つの hashCode が等しいかどうかは問題なのでしょうか? hashCode() は equals() 以外の場所で使用できますか? はいの場合、どのような目的で?


私は次のように2つの方法を実装することを考えました:

@Override
public boolean equals(Object obj) {
    return obj != null && obj.hashCode() == hashCode();
}

@Override
public int hashCode() {
    return Arrays.hashCode(new Object[] { getClass(), id });
}

クラスを hashCode 生成に追加すると、この潜在的な問題が解決されます。どう思いますか?それは必要ですか?

4

6 に答える 6

2

異なるクラスのオブジェクトの場合、同じhashCode()ことは重要ではありません。唯一のhashCode()ことは、オブジェクトがおそらく同じであることを示しています。たとえばHashSet、同じものに遭遇した場合、 とhashCode()の等しいかどうかをテストしequals()ます。

于 2013-02-07T10:49:29.617 に答える
1

ルールは簡単です:

  • A.equals(B)示すB.hashcode() == A.hashcode()
  • B.hashcode() != A.hashcode()示す!A.equals(B)

2 つの間に他の関係があってはなりません。hashcode()内部で使用するequals()と、警告が表示されます。

于 2013-02-07T10:52:37.170 に答える
0

そうではありません。AがBを拡張する場合、またはBがAを拡張する場合、次の理由により、equalsメソッドに問題があります。

a.equals(b) != b.equals(a)

aとbがたまたま同じハッシュコードを持っている場合。

于 2013-02-07T10:54:42.970 に答える
0

ハッシュコードは絶対に使用されませんequalsこれは、ハッシュ テーブルと呼ばれるデータ構造に基づくコレクションによって使用されます。正確性の観点からは、2 つのハッシュコードが互いに等しいことは常に問題ありません。これはハッシュ衝突と呼ばれ、一般的に避けられないものであり、唯一の結果はパフォーマンスの低下です。

于 2013-02-07T10:50:38.623 に答える
0

2 つの異なるオブジェクト (同じタイプであっても) が等しいハッシュ コードを持つことに問題はありませんが、2 番目のバリアントはequals()私には奇妙に見えます。オブジェクトが同じタイプのオブジェクトのみと比較されることを保証できる場合にのみ機能します。

于 2013-02-07T10:51:30.700 に答える
0
Could hashCode() be used somewhere else than in equals()?

このメソッドは、 javadocjava.util.Hashtable.から提供されるハッシュテーブルなどの利点のためにサポートされています。

また

hashCode の一般的な契約は次のとおりです。

  • Java アプリケーションの実行中に同じオブジェクトに対して複数回呼び出された場合は常に、オブジェクトの equals 比較で使用される情報が変更されていない限り、hashCode メソッドは一貫して同じ整数を返す必要があります。この整数は、あるアプリケーションの実行から同じアプリケーションの別の実行まで一貫性を保つ必要はありません。
  • equals(Object) メソッドに従って 2 つのオブジェクトが等しい場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、同じ整数結果が生成される必要があります。equals(java.lang.Object) メソッドに従って 2 つのオブジェクトが等しくない場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、異なる整数結果が生成される必要はありません。ただし、プログラマーは、等しくないオブジェクトに対して個別の整数結果を生成すると、ハッシュテーブルのパフォーマンスが向上する可能性があることに注意する必要があります。
  • 2 つのオブジェクトがメソッドに従って等しくない場合、2 つのオブジェクトequals(java.lang.Object)のそれぞれで hashCode メソッドを呼び出すと、異なる整数結果が生成される必要はありません。ただし、プログラマーは、等しくないオブジェクトに対して個別の整数結果を生成すると、 hashtables のパフォーマンスが向上する可能性があることに注意する必要があります。
于 2013-02-07T10:52:13.263 に答える