理解する
HashCode()の目的は、ハッシュコードとも呼ばれるハッシュコードを取得することです。実際に整数を返します。このハッシュコードの機能は、ハッシュテーブル内のオブジェクトのインデックス位置を決定することです。
HashCode()はJDKのObject.javaで定義されています。これは、JavaのクラスにはHashCode()関数が含まれていることを意味します。
ただし、各JavaクラスにはHashCode()関数が含まれています。ただし、クラスのハッシュコード()は、「ハッシュテーブル」を作成および作成するときにのみ役立ちます(「ハッシュテーブル」の以下の説明を参照)(機能は、ハッシュテーブルのクラスの各オブジェクトの位置を決定することです。たとえば、クラスの単一のオブジェクトを作成するか、クラスのオブジェクトの配列を作成するなど)
上記のハッシュリストには、ハッシュマップ、ハッシュテーブル、ハッシュセットなど、本質的にハッシュリストであるJavaコレクションのクラスが言及しています。
言い換えれば、HashCode()はハッシュリストでのみ役立ちますが、他の場合は役に立たない。ハッシュテーブルでのhashcode()の関数は、オブジェクトのハッシュコードを取得し、ハッシュテーブル内のオブジェクトの位置を決定することです。
ハッシュテーブルには、「キー」に基づいて対応する「値」をすばやく取得できるキーと値のペアが保存されていることがわかります。これはハッシュコードを使用します!
ハッシュテーブルの本質は、配列を介して実装されます。ハッシュテーブルで特定の「値」を取得したい場合は、実際に配列内の特定の位置に要素を取得したいと考えています。配列の位置は「キー」によって取得されます。さらに、配列の位置は、「キー」に対応するハッシュコードによって計算されます。
以下では、ハッシュセットを例として、HashCode()の役割を詳細に説明します。
ハッシュセットにはすでに1000の要素があるとします。 1001番目の要素を挿入するときはどうすればよいですか?ハッシュセットはセットコレクションであるため、要素を重複させることができます。
「1001番目の要素を以前の1000要素と1つずつ比較してください」?明らかに、この効率も同様に非効率的です。ハッシュテーブルはこの問題を非常にうまく解決します。ハッシュコードに基づいてハッシュテーブル内の要素の位置を計算し、その位置に要素を挿入します。同じ要素について、当然、1つだけが保存されます。
このことから、2つの要素が等しい場合、ハッシュコードは等しくなければならないことがわかります。しかし、逆の方法はそうではありません。ハッシュテーブルで、
1. 2つのオブジェクトが等しい場合、HashCode()値は同じでなければなりません。
2。2つのオブジェクトがhashcode()が等しい場合、必ずしも等しいとは限りません。
注:これは、ハッシュテーブルの場合です。これは、非ハッシュリストに当てはまる必要があります!
例
特定の例を見てみましょう。
パブリッククラスのハッシュテスト{private int i; public int geti(){return i; } public void seti(int i){this.i = i; } public int hashcode(){return i%10; } public final static void main(string [] args){hashtest a = new Hashtest();ハッシュテストb = new Hashtest(); a.seti(1); B.Seti(1); set <hashtest> set = new Hashset <hashtest>(); set.add(a); set.add(b); system.out.println(a.hashcode()== b.hashcode()); System.out.println(A.Equals(b)); System.out.println(set); }}この出力の結果:
True False [com.ubs.sae.test.hashtest@1、com.ubs.sae.test.hashtest@1]
上記の例では、ハッシュコードメソッドを書き直すだけです。上記の結果から、2つのオブジェクトのハッシュコードは等しいが、2つのオブジェクトは実際には等しくないことがわかります。等しい方法を書き換えず、2つのオブジェクトの参照が同じであるかどうかを比較するためにオブジェクトのデフォルトの方法を呼び出します。ここでは、生成されたオブジェクトをハッシュセットに配置し、ハッシュセットに保存できる一意のオブジェクトのみ、つまり同じオブジェクト(等しい方法に適用可能)が1つのみを保存しますが、実際にはハッシュセットに配置された2つのオブジェクトAとBがあります。
この時点で、等しい方法を追加します。
パブリッククラスのハッシュテスト{private int i; public int geti(){return i; } public void seti(int i){this.i = i; } <Span style = "color:#3366ff;"> <strong> public boolean equals(object object){if(object == null){return false; } if(object == this){return true; } if(!(object instanceof hashtest)){return false; } hashtest other =(hashtest)object; if(other.geti()== this.geti()){return true; } falseを返します。 } </strong> </span> public int hashcode(){return i%10; } public final static void main(string [] args){hashtest a = new Hashtest();ハッシュテストb = new Hashtest(); a.seti(1); B.Seti(1); set <hashtest> set = new Hashset <hashtest>(); set.add(a); set.add(b); system.out.println(a.hashcode()== b.hashcode()); System.out.println(A.Equals(b)); System.out.println(set); }}この時点で得られた結果は次のとおりです。
true true [com.ubs.sae.test.hashtest@1]
結果から、2つのオブジェクトが完全に等しく、ハッシュセットに1つのオブジェクトのみが保存されていることがわかります。
要約します
1.ハッシュコードの存在は、主にハッシュテーブル、ハッシュマップなどの高速性の検索に使用されます。ハッシュコードは、ハッシュストレージ構造内のオブジェクトのストレージアドレスを決定するために使用されます。
2。2つのオブジェクトが同じである場合、等しい(java.lang.object)メソッドに適用できます。これらの2つのオブジェクトのハッシュコードは同じでなければなりません。
3.オブジェクトの等しいメソッドが書き換えられた場合、オブジェクトのハッシュコードもできる限り書き換えられ、ハッシュコードで使用されるオブジェクトは等しい方法と同じものと一致する必要があります。そうしないと、上記の2番目のポイントに違反します。
4. 2つのオブジェクトのハッシュコードは同じです。つまり、2つのオブジェクトが同じであることを意味するわけではありません。つまり、必ずしも等しい(java.lang.object)メソッドに適用されるわけではありません。これらの2つのオブジェクトがハッシュテーブルなどのハッシュストレージ構造にあることを示すことができ、それらは「同じバスケットに保存されています」。