それは長い答えになるだろう、飲み物をつかんで読んで…
ハッシュとは、より速く読み書きできるメモリにキーと値のペアを格納することです。キーは配列に、値はLinkedListに格納します。
4つのキーと値のペアを保存したいとしましょう-
{
“girl” => “ahhan” ,
“misused” => “Manmohan Singh” ,
“horsemints” => “guess what”,
“no” => “way”
}
したがって、キーを格納するには、4つの要素の配列が必要です。これらの4つのキーの1つを4つの配列インデックス(0、1、2、3)にマップするにはどうすればよいですか?
したがって、javaは個々のキーのhashCodeを見つけ、それらを特定の配列インデックスにマップします。ハッシュコードの数式は-
1) reverse the string.
2) keep on multiplying ascii of each character with increasing power of 31 . then add the components .
3) So hashCode() of girl would be –(ascii values of l,r,i,g are 108, 114, 105 and 103) .
e.g. girl = 108 * 31^0 + 114 * 31^1 + 105 * 31^2 + 103 * 31^3 = 3173020
ハッシュとガール!! 私はあなたが何を考えているか知っています。そのワイルドなデュエットに対するあなたの魅力は、あなたが重要なことを見逃してしまうかもしれません。
なぜjavaは31を掛けますか?
31は2 ^ 5 – 1の形式の奇数の素数だからです。そして奇数の素数はハッシュ衝突の可能性を減らします
さて、このハッシュコードはどのように配列インデックスにマッピングされていますか?
答えは、Hash Code % (Array length -1)
です。だから、“girl”
にマッピングされている(3173020 % 3) = 1
我々の場合には。これは配列の2番目の要素です。
値「ahhan」は、配列インデックス1に関連付けられたLinkedListに格納されます。
HashCollision-hasHCode
キーを見つけよう“misused”
と“horsemints”
し、上記の式を 使用しようとすると、どちらも同じように表示され1069518484
ます。わぁぁぁぁぁぁぁぁ!学んだ教訓-
2つの等しいオブジェクトは同じhashCodeを持つ必要がありますが、hashCodeが一致する場合、オブジェクトが等しい場合の保証はありません。したがって、「誤用」と「horsemints」に対応する両方の値をバケット1(1069518484%3)に格納する必要があります。
ハッシュマップは次のようになります–
Array Index 0 –
Array Index 1 - LinkedIst (“ahhan” , “Manmohan Singh” , “guess what”)
Array Index 2 – LinkedList (“way”)
Array Index 3 –
本体がキーの値を見つけようとすると“horsemints”
、javaはすぐにそのハッシュコードを見つけてモジュール化し、対応するLinkedListでその値の検索を開始しindex 1
ます。したがって、この方法では、4つの配列インデックスをすべて検索する必要がないため、データアクセスが高速になります。
しかし、ちょっと待ってください。そのlinkedListに対応する配列インデックス1には3つの値があり、どの値がキー「horsemints」の値であったかをどのようにして見つけますか?
実際、私は嘘をつきました。私が言ったとき、HashMapは値をLinkedListに格納するだけです。
両方のキーと値のペアをマップエントリとして保存します。実際のマップは次のようになります。
Array Index 0 –
Array Index 1 - LinkedIst (<”girl” => “ahhan”> , <” misused” => “Manmohan Singh”> , <”horsemints” => “guess what”>)
Array Index 2 – LinkedList (<”no” => “way”>)
Array Index 3 –
これで、ArrayIndex1に対応するlinkedListをトラバースするときに、実際に各エントリのキーとそのLinkedListのキーを「horsemints」と比較し、1つが見つかると、その値を返すだけです。
あなたがそれを読んでいる間あなたが楽しんでいたらいいのに:)