-1

この質問にはすでに答えがあります。

これは私がハッシュコードと等価メソッドについて理解していることです。

  • obj1.hashcode == obj2.hashcode(trueを返す)の場合、obj1.equals(obj2)はtrueを返し、
  • obj1.equals(obj2)がfalseを返す(trueを返す)場合、obj1.hashcode == obj2.hashcode(falseを返す)

これは正しいです?


  • ちょっと待って。これはどのように重複していますか? - Makoto
  • リンクされたQ&Aの@Makotoがこの2つの契約を正確に説明しています。だから私はこれがどのようにあるのかわからないではない重複しています。 OPの質問に対する答えはそこにあります。しかし、ちょっと、この質問を再び開くために投票してください。 - Bart Kiers
  • さて...私がこの質問と(以前の)リンクされた重複を読んだことから、実装時の落とし穴について話しています。equals/hashCodeそして、これはの理解について話しているequals/hashCode。どのように表示されません質問そこに重複しています。 - Makoto
  • @Makotoが最初の、そして受け入れられた答えはその理由を特定a.equals(b)本当ですa.hashCode() == b.hashCode()。その答えを読むと、「これは正しいですか?」という質問に答えることができます。'自分の質問です。あなたが読み続けるならば(答えの深さの中で)、ハレドこの質問で答えられる論理的な声明を具体的に扱います。 - user289086
  • @owlstead問題ありません。 [重複が削除されていない限り]で - (削除されたターゲットを見ることができる)10k +のためにすることが役に立つ何かは通り抜けることですこの問い合わせそして、削除された、削除された投稿の対象となっている質問に、元に戻す(そしておそらくはロックされている)ことを示すフラグを立てるか、重複を再ターゲットするか、それらも削除します。 - user289086

3 답변


1

コンベンションの間にequals()そしてhashCode()これを強制する:

  • オブジェクトが等しいと判断された場合、それらのハッシュコード必須*等しくなるつまり、obj1.equals(obj2)それからobj1.hashCode() == obj2.hashCode()

  • オブジェクトがではないハッシュコードがそれらの間にあるべきであることのための絶対的な規則はありません。彼らできた同じハッシュコードを返すが、これは多数のエラーを引き起こす可能性がある。

*:この "must"は、コンパイル時または実行時には実際には実行不可能であるため、粒状の塩を使用してください。ただあなたがあなたのアプリケーションの正当性を危うくすることに注意してくださいequals/hashCode正しく実装されていない場合は使用方法


  • '規約を言い換えてください' '契約'へそれ以上のコンベンションこれは通常、ファイル構造、インデント、コメント、命名をカバーします(getX / setXは規約です)。 equalsとhashCodeの関係はもっと契約です - それはしなければならない物事が働くようにこのように働きます。その「契約」を指摘します。説明の2行目では、「hashCodeの一般規約は次のとおりです。 - user289086

1

もしobj1.hashcode==obj2.hashcode(戻るtrueobj1.equals(obj2) 戻るかもしれないtrue

Javadocから

  • 2つのオブジェクトがequals(Object)メソッドを呼び出してからhashCode2つのオブジェクトそれぞれのメソッド   同じ整数結果を生成します。
  • 2つのオブジェクトが次の式に従って等しくない場合は必須ではありません。equals(java.lang.Object)メソッドを呼び出してからhashCodeメソッドオン   2つのオブジェクトはそれぞれ、異なる整数結果を生成しなければなりません。   ただし、プログラマは独自の   等しくないオブジェクトに対する整数の結果は、   ハッシュテーブル


  • はい、私はあなたがしばらくそこに持っていた2番目のステートメントが間違っていたと思った… - Alnitak

1

あれは間違っている。のドキュメント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の記事を参照してください。ハッシュ関数

リンクされた質問


関連する質問

最近の質問