実際、リンクされたリストを形成できた可能性があります。Map
契約でエントリを置き換える必要があるだけです。
V put(K key, V value)
指定された値をこのマップ内の指定されたキーに関連付けます (オプションの操作)。マップに以前にキーのマッピングが含まれていた場合、古い値は指定された値に置き換えられます。(マップ m は、m.containsKey(k) が true を返す場合にのみ、キー k のマッピングを含むと言われます。)
http://docs.oracle.com/javase/6/docs/api/java/util/Map.html
値のリストを格納するマップの場合、Multimap
. Google は次のとおりです: http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Multimap.html
Map に似たコレクションですが、複数の値を 1 つのキーに関連付けることができます。同じキーで異なる値を指定して put(K, V) を 2 回呼び出すと、マルチマップにはキーから両方の値へのマッピングが含まれます。
編集:衝突の解決
それは少し違います。衝突は、2 つの異なるキーがたまたま同じハッシュ コードを持つ場合、または異なるハッシュ コードを持つ 2 つのキーが基になる配列の同じバケットにマッピングされる場合に発生します。
のソースを検討してくださいHashMap
(ビットとピースを削除):
public V put(K key, V value) {
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
// i is the index where we want to insert the new element
addEntry(hash, key, value, i);
return null;
}
void addEntry(int hash, K key, V value, int bucketIndex) {
// take the entry that's already in that bucket
Entry<K,V> e = table[bucketIndex];
// and create a new one that points to the old one = linked list
table[bucketIndex] = new Entry<>(hash, key, value, e);
}
Entry
のクラスがどのHashMap
ようにしてリストのように振る舞うかに興味がある人は、 が を実装HashMap
する独自の静的Entry
クラスを定義していることがわかりますMap.Entry
。ソースコードを表示すると、自分で確認できます。
HashMap の GrepCode