まず、hashCode の役割を理解するには、Java のコレクションについて知る必要があります。
一般に、Java には 2 種類のコレクションがあり、1 つは List で、もう 1 つは Set です。
それらの違いを知っていますか?前者のセットの要素は順序付けされており、要素を繰り返すことができますが、後者のセットの要素は順序付けされていませんが、要素を繰り返すことはできません。
ここで、より深刻な問題があります。要素が繰り返されないようにしたい場合、2 つの要素が繰り返されているかどうかを判断するための基準は何でしょうか?
これは Object.equals メソッドです。ただし、要素を追加するたびに 1 回チェックすると、要素の数が多い場合、コレクションに追加された要素間の比較の回数が非常に多くなります。
つまり、コレクション内に 1000 個の要素がある場合、1001 番目の要素がコレクションに追加されると、equals メソッドが 1000 回呼び出されます。これでは明らかに効率が大幅に低下します。
したがって、Java ではハッシュ テーブルの原理が採用されています。ハッシュは実際には人物の名前で、彼がハッシュ アルゴリズムの概念を提案したため、彼の名前にちなんで名付けられました。
ハッシュ アルゴリズムは、ハッシュ アルゴリズムとも呼ばれ、特定のアルゴリズムに従ってデータをアドレスに直接割り当てます。ハッシュアルゴリズムについて詳しく説明すると記事が長くなってしまうので、ここでは紹介しません。
初心者は、hashCode メソッドが実際にはオブジェクト ストレージの物理アドレスを返すことを理解できます (実際にはそうでない可能性があります)。
このようにして、新しい要素がコレクションに追加されると、この要素の hashCode メソッドが最初に呼び出され、要素を配置する物理的な場所がすぐに特定されます。
この位置に要素がない場合、この位置に要素がすでに存在する場合は、比較せずに直接この位置に格納できます。
そのequalsメソッドを呼び出して新しい要素と比較するだけで、同じでない場合は保存されません。
したがって、ここには競合の解決の問題があります。このようにして、equals メソッドへの実際の呼び出しの数は大幅に減り、ほぼ 1 回か 2 回だけになります。
したがって、Java は eqauls メソッドと hashCode メソッドに対してこれを提供します。
1. 2 つのオブジェクトが同じである場合、それらの hashCode 値は同じでなければなりません。 2. 2 つのオブジェクトの hashCode が同じである場合、それらは必ずしも同じである必要はありません。イコールメソッド。
もちろん、必要に応じてこれを行う必要はありませんが、同じオブジェクトが Set コレクションに表示されることがわかります。同時に、新しい要素を追加する効率も大幅に低下します。ハッシュコード方法は、2 つのオブジェクトが等しいかどうかを判断するために使用されます。
そうすると、equals というメソッドがあるのではないか、ということになるでしょう。 はい、これら 2 つのメソッドは、2 つのオブジェクトが等しいかどうかを判断するために使用されます。しかし、それらは違います。 一般に、2 つのオブジェクトが等しいかどうかを判断したい場合、equals メソッドがユーザーによって呼び出されます。
等しいかどうかを判断するために、equals メソッドをオーバーライドしてコード内で呼び出すことができます。簡単に言えば、equals メソッドは主に 2 つのオブジェクトが表面または内容から等しいかどうかを判断するために使用されます。たとえば、学生クラスがあります。
属性は名前と性別だけなので、名前と性別が等しい限り、2 つのオブジェクトは等しいと考えることができます。たとえば、ハッシュマップではキーを繰り返すことができないため、ハッシュコード メソッドは通常ユーザーによって呼び出されません。
キーが重複しているかどうかを判断する際には、ハッシュコード方式で判断し、イコール方式も使用しました。ここで繰り返してはいけないのは、equals と hashcode のいずれかが等しくなければ問題ないということです。簡単に言うと、ハッシュコードは、ファイル内の md5 と同様に、オブジェクトのエンコーディングと同等です。これは、比較すると直感的ではない int 型を返すという点で、equals とは異なります。一般に、イコールをオーバーライドするときは、ロジックの一貫性を保つためにハッシュコードを上書きします。例えば、
まだ先ほどの例を使用しますが、名前と性別が等しい場合、2 つのオブジェクトが等しい場合でも、ハッシュコード メソッドは名前のハッシュコード値と性別のハッシュコード値も返す必要があるため、論理的には一貫性があります。 。
2 つのオブジェクトが等しいかどうかを物理的に判断するには、== を使用するだけです。