HashMap.get中的循环

时间:2013-10-13 17:01:04

标签: java hashmap

这是一个从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       }

2 个答案:

答案 0 :(得分:3)

O(1)的部分在这里:

table[indexFor(hash, table.length)]

查找要迭代的列表正好是O(1)。如果散列函数是好的,那么迭代的大多数列表只有几个项目的长度。平均而言,搜索将在少量迭代之后停止,这些迭代不依赖于散列项的总数。这为您提供摊销访问时间O(1)

答案 1 :(得分:3)

HashXXXX个集合包括:

  • 一个数组。通过其hashCode

  • 将对象分配给数组中的位置( bucket
  • 条目列表。由于您可以将许多条目的哈希码指向同一个存储桶,因此每个存储桶都包含项目列表。新项目将添加到该列表中(因此不会删除以前的项目。)

迭代从第二点开始沿着该列表运行。