2 つのオブジェクトが等しい場合は、ハッシュコードが同じであることを意味しますが、その逆ではありません。
2 つの等しいオブジェクト ------> 同じハッシュコードを持つ
2 つのオブジェクトが同じハッシュコード ----xxxxx を持っています --> それらは等しくありません
HashMap の Java 8 更新 -
コードでこの操作を行います-
myHashmap.put("old","old-value");
myHashMap.put("very-old","very-old-value");
したがって、ハッシュコードが両方のキーに対して返され、同じ"old"
であるとします"very-old"
。それからどうなるでしょう。
myHashMap
は HashMap であり、最初にその容量を指定しなかったとします。したがって、Java のデフォルトの容量は 16 です。新しいキーワードを使用してハッシュマップを初期化するとすぐに、16 個のバケットが作成されます。最初のステートメントを実行したとき-
myHashmap.put("old","old-value");
次に、ハッシュコード"old"
が計算され、ハッシュコードも非常に大きな整数になる可能性があるため、Javaは内部的にこれを行いました-(ハッシュはここのハッシュコードで、>>>は右シフトです)
hash XOR hash >>> 16
より大きな図として示すと、0 から 15 の間のインデックスが返されます。これで、キー"old"
と値のペア"old-value"
が Entry オブジェクトのキーと値のインスタンス変数に変換されます。次に、このエントリ オブジェクトがバケットに格納されます。または、特定のインデックスで、このエントリ オブジェクトが格納されると言えます。
参考までに- Entry は Map インターフェイスのクラスです- Map.Entry、これらの署名/定義
class Entry{
final Key k;
value v;
final int hash;
Entry next;
}
次のステートメントを実行すると、
myHashmap.put("very-old","very-old-value");
と"very-old"
同じハッシュコードを与える"old"
ため、この新しいキーと値のペアは同じインデックスまたは同じバケットに再度送信されます。ただし、このバケットは空ではないためnext
、Entry オブジェクトの変数を使用して、この新しいキーと値のペアを格納します。
これは、同じハッシュコードを持つすべてのオブジェクトの連結リストとして保存されますが、TRIEFY_THRESHOLD は値 6 で指定されます。したがって、これに達すると、連結リストは最初の要素を根。