这是一个从HashMap中的键中获取值的代码。为什么需要在第317行循环才能获取值?这不应该是O(1)操作吗?
public V get(Object key) {
315 if (key == null)
316 return getForNullKey();
317 int hash = hash(key.hashCode());
318 for (Entry<K,V> e = table[indexFor(hash, table.length)];
319 e != null;
320 e = e.next) {
321 Object k;
322 if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
323 return e.value;
324 }
325 return null;
326 }
答案 0 :(得分:3)
O(1)
的部分在这里:
table[indexFor(hash, table.length)]
查找要迭代的列表正好是O(1)
。如果散列函数是好的,那么迭代的大多数列表只有几个项目的长度。平均而言,搜索将在少量迭代之后停止,这些迭代不依赖于散列项的总数。这为您提供摊销访问时间O(1)
。
答案 1 :(得分:3)
HashXXXX
个集合包括:
一个数组。通过其hashCode
条目列表。由于您可以将许多条目的哈希码指向同一个存储桶,因此每个存储桶都包含项目列表。新项目将添加到该列表中(因此不会删除以前的项目。)
迭代从第二点开始沿着该列表运行。