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