实际上,它本可以形成一个链表。只是Map
合同要求它替换条目:
V put(K key, V value)
将指定值与此映射中的指定键关联(可选操作)。如果该映射先前包含该键的映射,则旧值将替换为指定值。(仅当m.containsKey(k)返回true时,才认为映射m包含键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的集合,但是可以将多个值与单个键相关联。如果使用相同的键但值不同的方法两次调用put(K,V),则多重映射将包含从键到两个值的映射。
编辑:碰撞分辨率
有点不同。当两个不同的键碰巧具有相同的哈希码,或者两个具有不同的哈希码的键恰巧映射到基础数组中的同一存储桶时,就会发生冲突。
考虑HashMap
的来源(删除的碎片):
public V put(K key, V value) {
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
addEntry(hash, key, value, i);
return null;
}
void addEntry(int hash, K key, V value, int bucketIndex) {
Entry<K,V> e = table[bucketIndex];
table[bucketIndex] = new Entry<>(hash, key, value, e);
}
对于那些好奇Entry
类中的HashMap
行为如何像列表一样的人,事实证明它HashMap
定义了自己的Entry
实现的静态类Map.Entry
。您可以通过查看源代码自己查看:
HashMap的GrepCode