[英]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.