2013-07-17 51 views
1

雖然在看看HashMap類裏面,我碰到這種方法來: -條目<K, V>類使用recordAccess(本)的

/** 
    * This method is invoked whenever the value in an entry is 
    * overwritten by an invocation of put(k,v) for a key k that's already 
    * in the HashMap. 
    */ 
    void recordAccess(HashMap<K,V> m) { 
    } 

其實,這種方法是在內部類的Entry<K, V>

中定義

我無法做出該評論。這種方法做什麼?

PS:我還可以看到被調用這個方法裏面的HashMap中的putForNullKey()方法

private V putForNullKey(V value) { 
     for (Entry<K,V> e = table[0]; e != null; e = e.next) { 
      if (e.key == null) { 
       V oldValue = e.value; 
       e.value = value; 
       e.recordAccess(this); // call 
       return oldValue; 
      } 
     } 
     modCount++; 
     addEntry(0, null, value, 0); 
     return null; 
    } 

更新:我已經更新了第一代碼片段。

回答

4

LinkedHashMap可以有兩個順序:插入順序或訪問順序。如果使用訪問順序,則此方法可確保將訪問的條目移至列表的開頭。

+0

請您詳細說明一下嗎?爲什麼從HashMap的方法中調用它? – tmgr

+1

這是一個實現細節。爲了使HashMap和LinkedHashMap之間的代碼相互關聯,基礎Map.Entry定義了這個方法(默認情況下什麼都不做),並且HashMap調用它。在LinkedHashMap中,此方法被覆蓋以維護訪問順序。 –

+0

檢查我的編輯。在HashMap的Entry內部類中,recordAccess()是一個無所事事的方法。 – tmgr