キーにハッシュ手法を適用して、その値をメモリアドレスに格納することを理解しています。
しかし、ここで衝突がどのように起こっているのかわかりませんか? Java がメモリ空間を作成するために使用するハッシュ アルゴリズムはどれですか? MD5ですか?
の基本的な考え方HashMap
は次のとおりです。
HashMap
は実際には、キーと値の両方を保持する特別なオブジェクトの配列です。hashCode()
、すべてのオブジェクトが持つメソッドによって提供されます。したがって、新しい を作成するときは、メソッドの適切な実装Class
に注意する必要があります。(クラスの)デフォルトのものは、メモリポインタを数値として受け取ります。しかし、これは、使用したいほとんどのクラスには適していません。たとえば、このクラスは、文字列内のすべての文字からハッシュを作成するアルゴリズムを使用します。これは次のように考えてください: (簡略化)。したがって、メモリ内の異なる場所にある場合でも、2 つの等しい文字列は同じになります。hashCode()
equals()
Object
String
hashCode = 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 。Hashing
Object
読み:
これは、HashMapがどのように機能するかについてのより明確な説明ですか?
クラスのデフォルトの実装 hashCode()
関数Object
として、メモリアドレスをHashTable
&のキーとして使用されるハッシュとして返しHashMap
ます。
@Slanec の回答を確認した後、Java-8 の javadoc を参照してください。大幅な変更があります。例: 「TREEIFY」。バケットあたりのエントリ数のしきい値 (現在は 8) に達した場合に、LinkedList が TreeMap に変換されます。