web-dev-qa-db-ja.com

ハッシュマップでは、バケットの内部リンクリストへの新しい要素の追加は常に最後に行われます。どうして?

ハッシュマップでは、同じハッシュコードがある場合、後でTreeNodeに変換されるリンクリストとしてオブジェクトを挿入します。同じハッシュコードを持つすべての新しいオブジェクトは、リンクされたリンクリストの最後に追加されます。それで、ここで私の質問は、バケットに接続された内部リンクリストの最初の要素として新しい要素を追加しないのはなぜですか?なぜ最後の要素までトラバースしてから、新しい要素を追加するのですか。

リンクされたリストが次の時間を要した時間:

開始時に新しい要素を挿入= O(1)

末尾に新しい要素を挿入= O(n)


可能性のある答えは、ハッシュマップがスレッドセーフではないため、単一の位置からの要素の同時読み取りと書き込みが異常につながる可能性があるためです。たとえば、2つのトランザクションがあります。

T1-ハッシュマップにすでに存在するハッシュコードを持つマップに新しいオブジェクトを追加します。

T2-マップからの新しいオブジェクトの読み取り。ハッシュマップにハッシュコードがすでに存在しています。

これら2つのトランザクションが同時に行われ、最後の場所ではなく新しい要素を先頭に追加し始めると、最初の位置で変更が行われるため、読み取り操作に影響が出る可能性が少しあります。

誰かがこれについてより良い洞察を得ることができるなら、コメントしてください。

9
dgupta3091

ハッシュコードが同じ場合は、要素を追加することはできないからです。ハッシュコードが同じ場合、各リンクリストノードのキーでequalsを確認する必要があります。したがって、リンクされたリスト全体をトラバースして、同じキーがすでに存在するかどうかを確認する必要があります。

21
Amit Bera