キーにハッシュ手法を適用して、その値をメモリアドレスに格納することを理解しています。
しかし、ここで衝突がどのように起こっているのかわかりませんか? Java がメモリ空間を作成するために使用するハッシュ アルゴリズムはどれですか? MD5ですか?
の基本的な考え方HashMapは次のとおりです。
HashMapは実際には、キーと値の両方を保持する特別なオブジェクトの配列です。hashCode()、すべてのオブジェクトが持つメソッドによって提供されます。したがって、新しい を作成するときは、メソッドの適切な実装Classに注意する必要があります。(クラスの)デフォルトのものは、メモリポインタを数値として受け取ります。しかし、これは、使用したいほとんどのクラスには適していません。たとえば、このクラスは、文字列内のすべての文字からハッシュを作成するアルゴリズムを使用します。これは次のように考えてください: (簡略化)。したがって、メモリ内の異なる場所にある場合でも、2 つの等しい文字列は同じになります。hashCode()equals()ObjectStringhashCode = 1.char + 2.char + 3.char...hashCode()hashCode()、たとえば「132」は、配列がそれほど大きい場合にオブジェクトを格納するバケットの数です。しかし、そうではありません。私たちのバケツの長さはわずか 16 です。したがって、明らかな計算'hashcode % array.length = bucket'orを使用して'132 mod 16 = 4'、キーと値のペアをバケット番号 4 に保存します。HashMapを伝えたいと考えています。Mapsこの場合、
mod 256、配列内の 4 つの異なるスロットを指します。ここで、Sandra Dee の電話番号を検索しようとすると、彼女の名前をハッシュし、256 で mod して、バケット 152 を調べます。そこに John Smith が見つかります。それはサンドラではありません。もっと見てください...ああ、ジョンの後に鎖でつながれているサンドラがいます。
これは、 MD5などHashの手法を意味するものではありません。特定のキーのを格納するために使用されるメモリ位置のHashCode 。HashingObject
読み:
これは、HashMapがどのように機能するかについてのより明確な説明ですか?
クラスのデフォルトの実装 hashCode()関数Objectとして、メモリアドレスをHashTable&のキーとして使用されるハッシュとして返しHashMapます。
@Slanec の回答を確認した後、Java-8 の javadoc を参照してください。大幅な変更があります。例: 「TREEIFY」。バケットあたりのエントリ数のしきい値 (現在は 8) に達した場合に、LinkedList が TreeMap に変換されます。