Java Hash Storage
Javaにおけるハッシュストレージのデータ構造とは、主にHashSet、HashMap、LinkedHashSet、LinkedHashMap、HashTableなどを指します。 Java のハッシュ ストレージ メカニズムを理解するには、まず、equals() と hashCode() という 2 つのメソッドを理解する必要があります。 equals() メソッドと関係演算子「==」との違いについては、別の記事で説明しています。 hashCode() に関しては、これは Object クラスで定義されたメソッドです。
public native int hashCode();
これは、int 値を返すローカル メソッドであり、Object クラスには実装されていません。このメソッドは主にハッシュを使用するデータ構造で使用され、通常はハッシュベースのコレクションで機能します。たとえば、オブジェクトをコンテナー (HashMap であると想定します) に挿入するときに、そのオブジェクトが既にコンテナーに存在するかどうかを確認する方法です。コンテナはどこですか?コンテナーには数千の要素が存在する可能性があるため、equals() メソッドを使用して要素を順番に比較するのは非常に非効率的です。ハッシュの価値は速度であり、キーをどこかに保存して、すぐに見つけられるようにします。一連の要素を格納する最も高速なデータ構造は配列であるため、キー情報を格納するには配列を使用します (キー自体ではなくキー情報であることに注意してください)。しかし、配列はその容量を調整できないため、問題が発生します。マップに不確実な数の値を保存したいのですが、キーの数が配列の容量によって制限されている場合はどうすればよいでしょうか?
答えは、配列はキー自体を保存するのではなく、キーオブジェクトを通じて数値を生成し、それを配列の添字として使用します。この数値は、オブジェクトで定義されているハッシュコード(ハッシュコード)です。クラスによってオーバーライドされる hashCode() メソッドによって生成されます。固定配列容量の問題を解決するために、異なるキーが同じ添え字を生成する可能性があり、これは競合と呼ばれる現象です。したがって、コンテナ内の値をクエリするプロセスは、まず hashCode() を通じて挿入されるオブジェクトのハッシュ コードを計算し、次にそのハッシュ コードを使用して配列をクエリします。競合は外部リンクを通じて処理されることがよくあります。つまり、配列には値が直接保存されるのではなく、値のリストが保存され、リスト内の値に対して線形クエリが実行されます。クエリのこの部分は自然に実行されます。もっとゆっくり。ただし、ハッシュ関数が十分に優れている場合は、配列内の各位置の値の数は少なくなります。したがって、ハッシュ メカニズムは、少数の要素のみを比較して、配列内の特定の位置にすばやくジャンプできます。これが HashMap が非常に高速である理由です。HashMap.put() メソッドを通じてそれを体験できます。 object を取得し、ハッシュ コードを通じて配列の添字 i を取得します。 table[i] で表されるリストを反復処理し、equals() によってキーが存在するかどうかを判断します。存在する場合は、古い値を新しい値で更新し、そうでない場合は、新しいキーと値のペアを HashMap に追加します。 。ここから、 hashCode メソッドは、equals メソッドの呼び出し数を減らし、それによってプログラムの効率を向上させるために存在していることがわかります。
ここで注意する必要があります: hashCode() は必ずしも一意の識別コードを返すことができる必要はありませんが、equals() メソッドは 2 つのオブジェクトが同じかどうかを厳密に判断する必要があります。 読んでいただきありがとうございます、皆さんのお役に立てれば幸いです、このサイトをサポートしていただきありがとうございます!
Java ハッシュ ストレージのより詳細な説明と簡単な例については、PHP 中国語 Web サイトに注目してください。