2014-02-24 66 views
0

我很困惑,當地圖遇到重複密鑰 - 它進入同一個桶,因此它檢查相同的密鑰並用新值替換。地圖如何在內部輸入重複密鑰?

當插入不同的關鍵字時會發生什麼情況。

是否檢查密鑰以及它存儲密鑰的位置?

回答

2

我假設你在談論HashMap。讓我們來看看source

386  public V put(K key, V value) { 
387   if (key == null) 
388    return putForNullKey(value); 
389   int hash = hash(key.hashCode()); 
390   int i = indexFor(hash, table.length); 
391   for (Entry<K,V> e = table[i]; e != null; e = e.next) { 
392    Object k; 
393    if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { 
394     V oldValue = e.value; 
395     e.value = value; 
396     e.recordAccess(this); 
397     return oldValue; 
398    } 
399   } 
400 
401   modCount++; 
402   addEntry(hash, key, value, i); 
403   return null; 
404  } 

所以這裏發生了什麼就是put()方法散列鍵和訪問相應的桶。然後,它遍歷條目包含那裏,如果發現其主要equal S中的給定鍵的條目,它將替換該條目與給定值值,即:

if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { 
    V oldValue = e.value; 
    e.value = value; 
    e.recordAccess(this); 
    return oldValue; 
} 

如果沒有這樣的條目發現,我們只需添加一個新條目水桶正常,即:

modCount++; 
addEntry(hash, key, value, i); 
return null; 

Entry是包含鍵值對的類。

+0

那麼它的基本檢查關鍵等價?如果不同的鍵具有相同的值,它會創建一個新的條目對象。但是,在哪裏使用equals方法。我無法在代碼 – hitesh

+1

中看到它處於條件'((k = e.key)== key || key.equals k))的'。 –

1

地圖不允許重複鍵。如果插入了具有相同密鑰的元素,舊值將替換爲新值。

例如:假設我的地圖如下:

Key  Value Bucket 
A  Val1 1 
B  Val2 2 
C  Val3 1 

坎結構:

Bucket 1 : A -> C 
Bucket 2 : B 

當有人試圖進入另一元件(C,VAL6)其中C是鍵;那麼在插入之後地圖結構將如下:

Key  Value Bucket 
A  Val1 1 
B  Val2 2 
C  Val6 1 

因此,值在地圖中被替換。

坎結構:

Bucket 1 : A -> C 
Bucket 2 : B 

我們解決你問題的第二部分:當具有相同值的不同關鍵在同一個桶進入它只是增加桶(內部每個桶可能是就像一個ArrayList,其中元素添加在列表的末尾)。

例如:讓我們假設我們正在加入以下對(d,纈氨酸7)上述地圖和假設密鑰d映射到桶1。然後在地圖上結構將在插入之後,如下所示:

Key  Value Bucket 
A  Val1 1 
B  Val2 2 
C  Val6 1 
D  Val7 1 

坎結構:

Bucket 1 : A -> C -> D 
Bucket 2 : B 
0

當重複鍵輸入,它只是替換爲新的值前一個鍵的值。當一個不同的鍵被輸入到同一個桶中時,它首先檢查它是否是重複的,如果不是,那麼它將添加該鍵並且它是相應的值。

0

A HashMap「bucket」是一個鏈表。列表中的每個元素都包含鍵,值,鍵的散列和指向列表中下一個元素的指針。

所以,當發生散列衝突時,散列表將迭代桶中的每個條目。它將輸入哈希與插入密鑰哈希以及輸入密鑰的輸入密鑰進行比較。如果他們都是平等的,它會取代價值。如果它通過整個存儲桶而沒有匹配,則會向存儲桶中添加條目。