0

HashMap は通常、その値を最新のものに置き換えます。しかし、私が読んだ記事では、重複した値が追加された場合にリンクされたリストが保持されるため、それについて言及していました。

「2 つの異なるオブジェクトが同じハッシュコードを持つとどうなるか」を読んでください。

しかし、ConcurrentHashMap でさえそのようなリストを維持していないことがわかりませんでしたか?

リスト内の重複を維持するコレクションは何ですか?もしそうなら、get("key")メソッドを使用して関連するオブジェクトを識別する方法は?

4

4 に答える 4

2

「リスト」は、実際には、リンクされたリスト オブジェクト構造の再実装です。これは、HashMap がキーと値を格納するために使用する Entry クラスです。

static class Entry<K,V> implements Map.Entry<K,V> {
    final K key;
    V value;
    Entry<K,V> next;  <-- This one refers to the next element
    int hash
..
}

したがって、 の明示的な実装はありませんLinkedList

この記事では、2 つのキーが同じハッシュコードを持つとどうなるかについて説明していました。もちろん、両方のキーと値のペアを保存します。2 つのキーがequal()互いに関連している場合は、値が置き換えられます。

HashMap の詳細な仕組み: この質問に対する私の回答を参照してください:ハッシュテーブルのキーにするべきものに関するベスト プラクティス

于 2013-01-17T10:04:31.580 に答える
1

ハッシュマップが(一般的に)どのように機能するかは次のとおりです。

ハッシュマップは、物を入れるバケットのコレクションを保持します。何かを挿入すると、挿入しているキーにハッシュ関数が適用されます。結果として得られる「ハッシュ」によって、データを格納するバケットが決まります。2 つの異なるキーが同じバケットにハッシュされる可能性があります。これは、たとえば、バケット 10 にハッシュされる 2 番目のアイテムを挿入する場合、Java 実装は、バケット 10 のアイテムを追跡するリンク リストの最後に新しいアイテムを追加する必要があることを意味します。

2 つのアイテムが同じバケット (リンクされたリスト) に格納されているからといって、それらが同じキーを持っているとは限りません。これは、それらのキーがたまたま同じ値 (または、正確にはハッシュ バケットの数を法とする同等の値) にハッシュされることを意味します。

于 2013-01-17T10:06:28.040 に答える
0

ここに画像の説明を入力してください

ご覧のとおり、配列はハッシュコードです。2つのオブジェクトA2とB2が同じハッシュコードを持っている場合、それらは同じバケットに追加されます。

ただし、オブジェクトA2とA3が同じハッシュコードを持ち、戻っtrueてきたequals()場合、オブジェクトA2はA3に置き換えられます。

于 2013-01-17T10:20:29.020 に答える
0

ConcurrentHashMap の「同時」は、スレッド セーフを指し、1 つのキーに対して複数の値を格納することとは関係ありません。

おそらくここで問題の解決策を見つけることができます: HashMap with multiple values under the same key

于 2013-01-17T10:08:47.670 に答える