LinkedHashMap

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

基本信息

java.util.LinkedHashMap

java.lang.Object java.util.AbstractMap<K,V>

java.util.HashMap<K,V>

java.util.LinkedHashMap<K,V>

•類型參數:

•K - 由此映射維護的鍵的類型

•V - 映射值的類型

•所有已實現的接口:

•Serializable, Cloneable, Map

•public class LinkedHashMap

•extends HashMap

•implements Map

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 快取。調用 put 或 get 方法將會訪問相應的條目(假定調用完成後它還存在)。putAll 方法以指定映射的條目集疊代器提供的鍵-值映射關係的順序,為指定映射的每個映射關係生成一個條目訪問。 任何其他方法均不生成條目訪問。特別是,collection 視圖上的操作 不 影響底層映射的疊代順序。

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

此類提供所有可選的 Map 操作,並且允許 null 元素。與 HashMap 一樣,它可以為基本操作(add、contains 和 remove)提供穩定的性能,假定哈希函式將元素正確分布到桶中。由於增加了維護連結列表的開支,其性能很可能比 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, 序列化表格

方法摘要

方法摘要
voidclear()
從該映射中移除所有映射關係。
booleancontainsValue(Objectvalue)
如果此映射將一個或多個鍵映射到指定值,則返回 true。
Vget(Objectkey)
返回此映射到指定鍵的值。
protected booleanremoveEldestEntry(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

構造方法詳細

public LinkedHashMap(int initialCapacity, float loadFactor)

•構造一個帶指定初始容量和載入因子的空插入順序 LinkedHashMap 實例。

•參數:

•initialCapacity - 初始容量

•loadFactor - 載入因子

•拋出:

•IllegalArgumentException - 如果初始容量為負或者載入因子為非正

public LinkedHashMap(int initialCapacity)

•構造一個帶指定初始容量和默認載入因子 (0.75) 的空插入順序 LinkedHashMap 實例。

•參數:

•initialCapacity - 初始容量

•拋出:

•IllegalArgumentException - 如果初始容量為負

public LinkedHashMap()

•構造一個帶默認初始容量 (16) 和載入因子 (0.75) 的空插入順序 LinkedHashMap 實例。

public LinkedHashMap(Map<? extends K,? extends V>m)

•構造一個映射關係與指定映射相同的插入順序 LinkedHashMap 實例。所創建的 LinkedHashMap 實例具有默認的載入因子 (0.75) 和足以容納指定映射中映射關係的初始容量。

•參數:

•m - 要將其映射關係存放在此映射中的映射

•拋出:

•NullPointerException - 如果指定的映射為 null

public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)

•構造一個帶指定初始容量、載入因子和排序模式的空 LinkedHashMap 實例。

•參數:

•initialCapacity - 初始容量

•loadFactor - 載入因子

•accessOrder - 排序模式 - 對於訪問順序,為 true;對於插入順序,則為 false

•拋出:

•IllegalArgumentException - 如果初始容量為負或者載入因子為非正

方法詳細信息

containsValue

public boolean containsValue(Object value)

•如果此映射將一個或多個鍵映射到指定值,則返回 true。

•指定者:

•接口 Map 中的 containsValue

•覆蓋:

•類 HashMap 中的 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 中的 get

•覆蓋:

•類 HashMap 中的 get

•參數:

•key - 要返回其關聯值的鍵

•返回:

•指定鍵所映射的值;如果此映射不包含該鍵的映射關係,則返回 null

•另請參見:

•HashMap.put(Object, Object)

clear

public void clear()

•從該映射中移除所有映射關係。此調用返回後映射將為空。

•指定者:

•接口 Map 中的 clear

•覆蓋:

•類 HashMap 中的 clear

removeEldestEntry

protected boolean removeEldestEntry(Map.Entry<K,V>eldest)

•如果此映射移除其最舊的條目,則返回 true。在將新條目插入到映射後,put 和 putAll 將調用此方法。此方法可以提供在每次添加新條目時移除最舊條目的實現程式。如果映射表示快取,則此方法非常有用:它允許映射通過刪除舊條目來減少記憶體損耗。

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

•private static final int MAX_ENTRIES = 100; protected boolean removeEldestEntry(Map.Entry eldest) { return size() > MAX_ENTRIES; }

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

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

•參數:

•eldest - 在映射中最早插入的條目;如果是訪問順序映射,則為最早訪問的條目。如果此方法返回 true,則此為將移除的條目。如果導致此調用的 put 或 putAll 調用之前映射為空,則該條目就是剛剛插入的條目;換句話說,如果映射只包含單個條目,則最舊的條目也是最新的條目。

•返回:

•如果應該從映射移除最舊的條目,則返回 true;如果應該保留,則返回 false。

相關詞條

熱門詞條

聯絡我們