2014-11-13 154 views
0
public V put(K key, V value) { 
    if (table == EMPTY_TABLE) { 
     inflateTable(threshold); 
    } 
    if (key == null) 
     return putForNullKey(value); 
    int hash = hash(key); 
    int i = indexFor(hash, table.length); 
    for (Entry<K,V> e = table[i]; e != null; e = e.next) { 
     Object k; 
     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; 
} 

我想了解HashMap的實現。我理解除了這一行之外的所有內容 - 對象k;
請解釋這個Object k是怎麼出現的?什麼是對象k?

+1

我不明白你的困惑。看起來是因爲有人在那裏宣佈它。什麼是沒有意義的? –

+0

「對象k」與genric類型「K key」無關。它可以命名爲'Object foo',代碼仍然可以做同樣的事情 – ortis

+0

k在這裏使用:(k = e.key)==鍵。似乎是某種拳擊來檢查對象是否是引用相等的(如果你的'K'(你的Key的類型)是一個基本類型,它會將它封閉並且會返回false,因爲它們不會被引用相等但是如果它們都是非原始類型,它將檢查兩個對象是否是相同的引用。由於後面有key.equals(k)相等檢查,這只是一個性能檢查,以確保您不會調用潛在的昂貴的.equals()方法,如果你的鑰匙是同一個對象 – kha

回答

1

在執行HashMap時,數據結構由一系列鏈接的條目列表支持。這些條目有一個鍵和一個值。

該變量k用於在遍歷鏈表清單時迭代存儲每個條目的鍵值。如果發現它與要插入值的鍵相同(引用和值相等),則該值將替換舊值。