この質問にはすでに答えがあります。
これは私がハッシュコードと等価メソッドについて理解していることです。
- obj1.hashcode == obj2.hashcode(trueを返す)の場合、obj1.equals(obj2)はtrueを返し、
- obj1.equals(obj2)がfalseを返す(trueを返す)場合、obj1.hashcode == obj2.hashcode(falseを返す)
これは正しいです?
のコンベンションの間にequals()
そしてhashCode()
これを強制する:
オブジェクトが等しいと判断された場合、それらのハッシュコード必須*等しくなるつまり、obj1.equals(obj2)
それからobj1.hashCode() == obj2.hashCode()
。
オブジェクトがではないハッシュコードがそれらの間にあるべきであることのための絶対的な規則はありません。彼らできた同じハッシュコードを返すが、これは多数のエラーを引き起こす可能性がある。
*:この "must"は、コンパイル時または実行時には実際には実行不可能であるため、粒状の塩を使用してください。ただあなたがあなたのアプリケーションの正当性を危うくすることに注意してくださいequals
/hashCode
正しく実装されていない場合は使用方法
もし
obj1.hashcode
==obj2.hashcode
(戻るtrue
)obj1.equals(obj2)
戻るかもしれないtrue
- 2つのオブジェクトが
equals(Object)
メソッドを呼び出してからhashCode
2つのオブジェクトそれぞれのメソッド 同じ整数結果を生成します。- 2つのオブジェクトが次の式に従って等しくない場合は必須ではありません。
equals(java.lang.Object)
メソッドを呼び出してからhashCode
メソッドオン 2つのオブジェクトはそれぞれ、異なる整数結果を生成しなければなりません。 ただし、プログラマは独自の 等しくないオブジェクトに対する整数の結果は、 ハッシュテーブル
あれは間違っている。のドキュメントObject.equals(Object)
このメソッドを拡張するための契約の正式な説明があります。本質的にはObject.equals
メソッドは、2つのオブジェクトが実際に同じオブジェクトかどうかを確認することです。ただし、この機能をオーバーライドして代わりにクラスを作成するのは理にかなっています。equals
メソッドは2つのオブジェクトが論理的に互いに等しい(たとえば、両方とも同じ文を表すStringオブジェクトの2つの異なるインスタンス)。
一方、Object.hashCode()
以下の契約を指定します。
hashCodeの一般規約は次のとおりです。
- Javaアプリケーションの実行中に同じオブジェクトに対して2回以上呼び出されるたびに、hashCodeメソッドは必ず で使用される情報がない限り、一貫して同じ整数を返します。 オブジェクトのequals比較が変更されました。この整数は必要ありません アプリケーションの実行ごとに一貫性を保つ 同じアプリケーションの実行
- 2つのオブジェクトがequals(Object)メソッドに従って等しい場合は、2つの各オブジェクトでhashCodeメソッドを呼び出す必要があります。 同じ整数結果を生成します。
- 2つのオブジェクトがequals(java.lang.Object)メソッドに従って等しくない場合は、次のようにhashCodeメソッドを呼び出す必要はありません。 2つのオブジェクトはそれぞれ、異なる整数結果を生成しなければなりません。 ただし、プログラマは独自の 等しくないオブジェクトに対する整数の結果は、 ハッシュテーブル
合理的に実用的な範囲で、Objectクラスによって定義されたhashCodeメソッドは、異なるオブジェクトに対して異なる整数を返します。 (これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法はJava™プログラミング言語では必要ありません。)
基本的に、2つの異なるオブジェクト(論理的に異なるか技術的に異なる)よろしくハッシュコードはどのように設計されているかによって同じハッシュコードを持っていますが、いけない「等しい」ただし、2つのオブジェクトが互いに等しい場合、それらはしなければならない同じハッシュコードを持っています。同様に、オブジェクトのハッシュコードは、オブジェクト自体が何らかの方法で変化した場合にのみ変化する可能性があります。
詳しくは、次のWikipediaの記事を参照してください。ハッシュ関数。
equals
/hashCode
そして、これはの理解について話しているequals
/hashCode
。どのように表示されません質問そこに重複しています。 - Makotoa.equals(b)
本当ですa.hashCode() == b.hashCode()
。その答えを読むと、「これは正しいですか?」という質問に答えることができます。'自分の質問です。あなたが読み続けるならば(答えの深さの中で)、ハレドこの質問で答えられる論理的な声明を具体的に扱います。 - user289086