Javaコレクション– hashCode()およびequals()– Javaでequals()およびhashcode()メソッドをオーバーライドする方法は?

公開: 2018-08-08
JavaコレクションhashCodeと等しい

Javaのequals()hashCode()は、Objectクラスと一部またはコアのJavaライブラリで宣言される2つの基本的なメソッドです。

Javaで以下の懸念事項のいずれかがある場合は、適切な場所にいます。

  • Javaプラクティス-> equalsの実装
  • オーバーライド–JavaでのequalsとhashCodeのオーバーライド
  • Javaでequals()メソッドをオーバーライドする方法
  • JavaでhashCode()メソッドをオーバーライドする方法
  • JavaでequalsおよびhashCodeメソッドをオーバーライドする方法
  • Javaでequalsメソッドをオーバーライドする方法と理由
  • equals()をオーバーライドする場合、なぜ常にhashcode()をオーバーライドするのですか?

最初のReference EqualityLogical Equalityを理解するための簡単な例を見てみましょう。 等式演算子(==)は、2つの文字列の参照(メモリ内のアドレス)を2つの異なる数値として比較します。これはReference equalityとして知られています。

Logical equalityは、参照の値ではなく、オブジェクトのデータを比較します。

出力:

hashCodeequalsは密接に関連しています:

  • equalsをオーバーライドする場合は、 hashCodeをオーバーライドする必要があります。
  • hashCodeは、等しいオブジェクトに対して等しい値を生成する必要があります。
  • equalsおよびhashCodesame set of significant fields依存する必要があります。 これらの方法の両方で同じフィールドのセットを使用する必要があります。 すべてのフィールドを使用する必要はありません。 たとえば、他に依存する計算フィールドは、 equalsおよびhashCodeから省略される可能性が非常に高くなります。

equalsを実装する場合、フィールドはタイプに応じて異なる方法で比較されます。

  • コレクションを含むオブジェクトフィールド: equalsを使用
  • タイプセーフな列挙: equalsまたは==のいずれかを使用します(この場合、同じものになります)
  • nullの可能性のあるオブジェクトフィールド: ==equalsの両方を使用
  • 配列フィールド: Arrays.equalsを使用します
  • floatまたはdouble以外のプリミティブフィールド:use ==
  • float :を使用してintに変換しますFloat.floatToIntBits ,次に==を使用します
  • doubleDouble.doubleToLongBitsを使用してlongに変換し、次に==を使用します

hashCodeの実装:

  • クラスがequalsをオーバーライドする場合、 hashCodeをオーバーライドする必要があります
  • 両方がオーバーライドされる場合、 equalshashCodeは同じフィールドのセットを使用する必要があります
  • 2つのオブジェクトが等しい場合、それらのhashCode値も等しくなければなりません
  • オブジェクトが不変である場合、 hashCodeはキャッシングと遅延初期化の候補です

hashCodeがオブジェクトの一意の識別子を提供するというのはよくある誤解です。 そうではありません。

一般的な契約により、Javaのequals()メソッドは、再帰的、対称的、推移的、一貫性があり、null以外の参照はfalseを返す必要があります。 つまり、a、b、およびcの任意の値について、次のテストは常に合格する必要があります。

ベストプラクティスについては、以下の手順を使用して、equals()メソッドを実装します。

  • これを使用して==参照の同等性をチェックします
  • instanceofを使用して、正しい引数タイプをテストします
  • 引数を正しい型にキャストします
  • 重要なフィールドを比較して同等性を確認する

これが完全な例です。

CrunchifyImplementEqualsHashCode.java

Eclipseコンソールの出力: