JavaTM 2 Platform
Standard Ed. 6

java.util
類別 LinkedHashMap<K,V>

java.lang.Object
  繼承者 java.util.AbstractMap<K,V>
      繼承者 java.util.HashMap<K,V>
          繼承者 java.util.LinkedHashMap<K,V>
型別參數:
K - 由此映射維護的鍵的型別
V - 映射值的型別
所有已實作的介面:
Serializable, Cloneable, Map<K,V>

public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>

Map 介面的雜湊表和連接列表實作,具有可預知的迭代順序。此實作與 HashMap 的不同之處在於,後者維護著一個運行於所有條目的雙重連接列表。此連接列表定義了迭代順序,該迭代順序通常就是將鍵插入到映射中的順序(插入順序)。注意,如果在映射中重新插入 鍵,則插入順序不受影響。(如果在調用 m.put(k, v)m.containsKey(k) 返回了 true,則調用時會將鍵 k 重新插入到映射 m 中。)

此實作可以讓客戶避免未指定的、由 HashMap(及 Hashtable)所提供的通常為雜亂無章的排序工作,同時無需增加與 TreeMap 相關的成本。使用它可以產生一個與原來順序相同的映射副本,而與原映射的實作無關:

     void foo(Map m) {
         Map copy = new LinkedHashMap(m);
         ...
     }
 
如果模組通過輸入得到一個映射,複製這個映射,然後返回由此副本確定其順序的結果,這種情況下這項技術特別有用。(客戶通常期望返回的內容與其出現的順序相同。)

提供特殊的建構子來創建連接雜湊映射,該雜湊映射的迭代順序就是最後存取其條目的順序,從近期存取最少到近期存取最多的順序(存取順序)。這種映射很適合建構 LRU 快取記憶體。調用 putget 方法將會存取相應的條目(假定調用完成後它還存在)。putAll 方法以指定映射的條目集迭代器提供的鍵-值映射關係的順序,為指定映射的每個映射關係產生一個條目存取。任何其他方法均不產生條目存取。特別是,collection 視圖上的操作 影響底層映射的迭代順序。

可以覆寫 removeEldestEntry(Map.Entry) 方法來實施策略,以便在將新映射關係添加到映射時自動移除舊的映射關係。

此類別提供所有可選的 Map 操作,並且允許 null 元素。與 HashMap 一樣,它可以為基本操作(addcontainsremove)提供穩定的性能,假定雜湊函數將元素正確分佈到桶中。由於增加了維護連接列表的開支,其性能很可能比 HashMap 稍遜一籌,不過這一點例外:LinkedHashMap 的 collection 視圖迭代所需時間與映射的大小 成比例。HashMap 迭代時間很可能開支較大,因為它所需要的時間與其容量 成比例。

連接的雜湊映射具有兩個影響其性能的參數:初始容量載入因子。它們的定義與 HashMap 極其相似。要注意,為初始容量選擇非常高的值對此類別的影響比對 HashMap 要小,因為此類別的迭代時間不受容量的影響。

注意,此實作不是同步的。如果多個執行緒同時存取連接的雜湊映射,而其中至少一個執行緒從結構上修改了該映射,則它必須 保持外部同步。這一般通過對自然封裝該映射的物件進行同步操作來完成。如果不存在這樣的物件,則應該使用 Collections.synchronizedMap 方法來“包裹”該映射。最好在創建時完成這一操作,以防止對映射的意外的非同步存取:

    Map m = Collections.synchronizedMap(new LinkedHashMap(...));
結構修改是指添加或刪除一個或多個映射關係,或者在按存取順序連接的雜湊映射中影響迭代順序的任何操作。在按插入順序連接的雜湊映射中,僅更改與映射中已包含鍵關聯的值不是結構修改。在按存取順序連接的雜湊映射中,僅利用 get 查詢映射不是結構修改。

Collection(由此類別的所有 collection 視圖方法所返回)的 iterator 方法返回的迭代器都是快速失敗 的:在迭代器創建之後,如果從結構上對映射進行修改,除非通過迭代器自身的 remove 方法,其他任何時間任何方式的修改,迭代器都將拋出 ConcurrentModificationException。因此,面對共時的修改,迭代器很快就會完全失敗,而不冒將來不確定的時間任意發生不確定行為的風險。

注意,迭代器的快速失敗行為無法得到保證,因為一般來說,不可能對是否出現不同步共時修改做出任何硬性保證。快速失敗迭代器會盡最大努力拋出 ConcurrentModificationException。因此,編寫依賴於此異常的程序的方式是錯誤的,正確做法是:迭代器的快速失敗行為應該僅用於檢測程序錯誤。

此類別是 Java Collections Framework 的成員。

從以下版本開始:
1.4
另請參見:
Object.hashCode(), Collection, Map, HashMap, TreeMap, Hashtable, 序列化表格

巢狀類別摘要
 
從類別 java.util.AbstractMap 繼承的巢狀類別/介面
AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V>
 
建構子摘要
LinkedHashMap()
          建構一個帶預設初始容量 (16) 和載入因子 (0.75) 的空插入順序 LinkedHashMap 實例。
LinkedHashMap(int initialCapacity)
          建構一個帶指定初始容量和預設載入因子 (0.75) 的空插入順序 LinkedHashMap 實例。
LinkedHashMap(int initialCapacity, float loadFactor)
          建構一個帶指定初始容量和載入因子的空插入順序 LinkedHashMap 實例。
LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
          建構一個帶指定初始容量、載入因子和排序網要的空 LinkedHashMap 實例。
LinkedHashMap(Map<? extends K,? extends V> m)
          建構一個映射關係與指定映射相同的插入順序 LinkedHashMap 實例。
 
方法摘要
 void clear()
          從該映射中移除所有映射關係。
 boolean containsValue(Object value)
          如果此映射將一個或多個鍵映射到指定值,則返回 true
 V get(Object key)
          返回此映射到指定鍵的值。
protected  boolean removeEldestEntry(Map.Entry<K,V> eldest)
          如果此映射移除其最舊的條目,則返回 true
 
從類別 java.util.HashMap 繼承的方法
clone, containsKey, entrySet, isEmpty, keySet, put, putAll, remove, size, values
 
從類別 java.util.AbstractMap 繼承的方法
equals, hashCode, toString
 
從類別 java.lang.Object 繼承的方法
finalize, getClass, notify, notifyAll, wait, wait, wait
 
從介面 java.util.Map 繼承的方法
containsKey, entrySet, equals, hashCode, isEmpty, keySet, put, putAll, remove, size, values
 

建構子詳細資訊

LinkedHashMap

public LinkedHashMap(int initialCapacity,
                     float loadFactor)
建構一個帶指定初始容量和載入因子的空插入順序 LinkedHashMap 實例。

參數:
initialCapacity - 初始容量
loadFactor - 載入因子
拋出:
IllegalArgumentException - 如果初始容量為負或者載入因子為非正

LinkedHashMap

public LinkedHashMap(int initialCapacity)
建構一個帶指定初始容量和預設載入因子 (0.75) 的空插入順序 LinkedHashMap 實例。

參數:
initialCapacity - 初始容量
拋出:
IllegalArgumentException - 如果初始容量為負

LinkedHashMap

public LinkedHashMap()
建構一個帶預設初始容量 (16) 和載入因子 (0.75) 的空插入順序 LinkedHashMap 實例。


LinkedHashMap

public LinkedHashMap(Map<? extends K,? extends V> m)
建構一個映射關係與指定映射相同的插入順序 LinkedHashMap 實例。所創建的 LinkedHashMap 實例具有預設的載入因子 (0.75) 和足以容納指定映射中映射關係的初始容量。

參數:
m - 要將其映射關係存放在此映射中的映射
拋出:
NullPointerException - 如果指定的映射為 null

LinkedHashMap

public LinkedHashMap(int initialCapacity,
                     float loadFactor,
                     boolean accessOrder)
建構一個帶指定初始容量、載入因子和排序網要的空 LinkedHashMap 實例。

參數:
initialCapacity - 初始容量
loadFactor - 載入因子
accessOrder - 排序網要 - 對於存取順序,為 true;對於插入順序,則為 false
拋出:
IllegalArgumentException - 如果初始容量為負或者載入因子為非正
方法詳細資訊

containsValue

public boolean containsValue(Object value)
如果此映射將一個或多個鍵映射到指定值,則返回 true

指定者:
介面 Map<K,V> 中的 containsValue
覆寫:
類別 HashMap<K,V> 中的 containsValue
參數:
value - 其在此映射中的存在已經測試的值
返回:
如果此映射將一個或多個鍵映射到指定值,則返回 true

get

public V get(Object key)
返回此映射到指定鍵的值。如果此映射中沒有該鍵的映射關係,則返回 null

更確切地講,如果此映射包含滿足 (key==null ? k==null : key.equals(k)) 的從鍵 k 到值 v 的映射關係,則此方法返回 v;否則,返回 null。(最多只能有一個這樣的映射關係。)

返回 null 值並不 一定 表明此映射不包含該鍵的映射關係;也可能此映射將該鍵顯式地映射為 null。可使用 containsKey 操作來區分這兩種情況。

指定者:
介面 Map<K,V> 中的 get
覆寫:
類別 HashMap<K,V> 中的 get
參數:
key - 要返回其關聯值的鍵
返回:
指定鍵所映射的值;如果此映射不包含該鍵的映射關係,則返回 null
另請參見:
HashMap.put(Object, Object)

clear

public void clear()
從該映射中移除所有映射關係。 此調用返回後映射將為空。

指定者:
介面 Map<K,V> 中的 clear
覆寫:
類別 HashMap<K,V> 中的 clear

removeEldestEntry

protected boolean removeEldestEntry(Map.Entry<K,V> eldest)
如果此映射移除其最舊的條目,則返回 true。在將新條目插入到映射後,putputAll 將調用此方法。此方法可以提供在每次添加新條目時移除最舊條目的實作程序。如果映射表示快取記憶體,則此方法非常有用:它允許映射通過刪除舊條目來減少記憶體損耗。

範例用法:此覆寫允許映射增加到 100 個條目,然後每次添加新條目時刪除最舊的條目,始終維持 100 個條目的穩定狀態。

     private static final int MAX_ENTRIES = 100;

     protected boolean removeEldestEntry(Map.Entry eldest) {
        return size() > MAX_ENTRIES;
     }
 

此方法通常不以任何方式修改映射,相反允許映射在其返回值的指引下進行自我修改。使用此方法直接修改映射 允許的,但是如果它執行了此操作,則一定 返回 false(表示該映射不應進行任何進一步的修改)。在此方法中修改映射後是否返回 true 是不確定的。

此實作僅返回 false(這樣,此映射的行為將類似於正常映射,即永遠不能移除最舊的元素)。

參數:
eldest - 在映射中最早插入的條目;如果是存取順序映射,則為最早存取的條目。如果此方法返回 true,則此為將移除的條目。如果導致此調用的 putputAll 調用之前映射為空,則該條目就是剛剛插入的條目;換句話說,如果映射只包含單個條目,則最舊的條目也是最新的條目。
返回:
如果應該從映射移除最舊的條目,則返回 true;如果應該保留,則返回 false

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only