簡體   English   中英

HashMap.get中的循環

[英]A loop in HashMap.get

這是從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       }

O(1)部分在這里:

table[indexFor(hash, table.length)]

找到要迭代的列表正好是O(1) 如果哈希函數很好,則您迭代的大多數列表的長度只有幾個項目。 平均而言,搜索將在不依賴於哈希項總數的少量迭代之后停止。 這給您攤銷的訪問時間O(1)

HashXXXX集合包括:

  • 數組。 對象通過其hashCode分配給數組( 存儲桶 )中的某個位置

  • 條目列表。 由於您可以有許多條目,其哈希碼將它們指向相同的存儲桶 ,因此每個存儲桶都包含一個項目列表 新項目將添加到該列表中(因此它不會刪除以前的項目)。

迭代從第二點開始沿該列表運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM