書き換えと書き換え方法のhashCodeメソッドは、必ずしも因果関係ない等しいです

ブログのタイトルの多くが「に設定されている参照してくださいhashCodeメソッドをオーバーライドする必要がありequalsメソッドを書き換えた後、なぜ、これは実際には、顔の質問にあるものの、命題を一般化するために、状況を見ていない場合は、」、それは不必要な誤解を生じさせる可能性があります。上記のタイトルを簡単に等しいとハッシュコードとの間の因果関係を形成し、ハッシュコードは果実であるので等しいです。しかし、知っておくべきソースを読んで、オブジェクトのデフォルトの方法は、この== otherObjを返すことです等しく、hashCodeメソッドは、ローカルネイティブで、基本となるC ++で実装され、二つの方法とは完全に独立して、何の因果関係はありません。

議論するために、2つの間の関係が分離することはできません順不同コレクションを省略するなどのHashSet、HashMapのと、好ましい例があるようにと、順不同コレクションが繰り返されることはありませんへのアクセスカスタムオブジェクト:(、人のカスタムオブジェクトとなどがあり、フィールド名、年齢は、仮定の事業名と年齢要件は、2つの人に等しく等しいと見なされています

まず、次の基礎のための準備はほぼ完了

  • そのようなデータが格納されている方法などのHashMapとHashSetの?単純に2つの段階で言えば、最初のステップは、それがハッシュ対象者Aの論理アドレスに価値があります に対処する方法第次いで成功へのステップ、アドレスAには他のオブジェクトの場合は、そうでなければリスト(jdk1.7)または赤黒木(jdk1.8)治療ハッシュ衝突?バイナリ検索ツリーAが赤 - 黒、赤黒木にリストA吊りまたは吊りのトラバーサルを見つけるために開始点、またはリンクされたリストのノード場合人掛けを入れ、それぞれの人(比較が呼に等しい)に等しくありません同じノードは、人とその値を更新し、成功を置く、あるまで、または見つけます

HashSetのは、そのような人を堆積したい、それが最初にこの人を配置する場所を知っている必要があり、人は、hashCodeメソッドは、ハッシュ値を返す呼び出し、および長さ - 1相は、図のように、その論理アドレスを生成します。運がよけれ場合は、ここまで人を決定するために、HashSetのを競合を解決しませんでした

  • 整数、文字列、バイト、ブールおよび他のオブジェクトと同様、Javaが同じヒープ・オブジェクトの異なる値は依然として同じであるハッシュ値を作り、hashCodeメソッドを対応する書き換えられた、カスタムオブジェクトは、C ++リアライズである、オブジェクトhashCodeメソッドと呼ばれていますネイティブメソッドは、限りヒープオブジェクトであるように、異なるハッシュ値が同じではありません

あなたは見つけることが基本は困難を理解したら、

ハッシュコードをオーバーライドする理由は、同じ人ヒープ複数のオブジェクトのハッシュ値が等しいことを保証することです

ハッシュコードを書き換えていない場合は、人のネイティブメソッド呼び出しが達成するために、C ++で使用すると、2人の新しいPersonオブジェクトの名前と年齢の出ている場合でも、同じですが、それは二つの異なるヒープオブジェクト、C ++コードのセットであるため、異なるアウトハッシュになることその結果、HashMapのは、2つの異なる人のHashMapの1が最初に登場し、赤のビジネス紛争、第二、ように、異なる論理アドレスは、2つの異なる場所に保管されます参照して、論理アドレスが異なっているので、そして独特の順不同のコレクション紛争の定義、第三、あなたが動作時に取得し、それはあなたを取得するかを知っていません

等号を書き換えるための理由は、まず、ビジネスロジックに、すなわちカスタム、すべての後に、等しいと見なされているもの複数のフィールドを比較するオブジェクト。第二には、同じ重複カスタムオブジェクトを確保するために、HashSetのかHashMapのには表示されません。

等号書き換えない場合は、リストを横断、赤黒木で、その後のHashMapやHashSetのをや人が唯一のオブジェクトがequalsメソッドを呼び出すことができます紛争を扱うのと同じとみなさオブジェクトどのように比較的知らない、==使用すると、参照アドレス、名前、年齢、原因を比較します同じ人が、同じ緋文字の事業と同じ競合していないと判断されますされています。さらに、あなたはhashCodeメソッドを書き換えるする権利を持っていると仮定すると、同じ名前と年齢が人ヒープオブジェクトが同じ論理アドレスAにハッシュされますされ、この時間は同じ3人の名前と年齢を想定していることを保証するために、すなわち、第二の人がオブジェクトにマッピングされた後、その解決ハッシュ衝突にしようと、発見された、コールが等しくない==後に発見比較することによって、equalsの比較、HashMapのは、直接、二人のにリンクされて幸せ安心しましたリストまたは赤黒木は、そう、HashMapのは、二つの同じ人物が登場しました!あなたはそれを見つけるように、また、等号をオーバーライドする必要がありhashCodeメソッドを書き換えた後、

このように、書き換え、equalsメソッドとのリライトのhashCodeは必ずしも因果関係はありませんが、それは緑のフォントがあり、タイトルは、彼らがに変更できることではありません「なぜ書き換えのhashCodeもオーバーライドする必要がありますイコール?」それは?関係の内部ロジックをハッシュマップ、およびハッシュコード自体不可欠ピアに等しいです。より良い質問をする必要があります尋ねている:「?時々のhashCodeとequalsメソッドをオーバーライドする必要がプログラミングをなぜするとき」

37元記事公開 ウォン称賛42 ビューに14万+を

おすすめ

転載: blog.csdn.net/qq_37960007/article/details/104216478