鴻蒙OS LinkedHashMap

2022-07-26 17:07 更新

LinkedHashMap

java.lang.Object

|---java.util.AbstractMap<K,V&

|---|---java.util.HashMap<K,V&

|---|---|---java.util.LinkedHashMap<K,V&

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

Map 接口的哈希表和鏈表實(shí)現(xiàn),具有可預(yù)測(cè)的迭代順序。 此實(shí)現(xiàn)與 HashMap 的不同之處在于它維護(hù)一個(gè)雙向鏈表,該列表貫穿其所有條目。 這個(gè)鏈表定義了迭代順序,通常是鍵插入映射的順序(插入順序)。 請(qǐng)注意,如果將鍵重新插入到 map 中,則插入順序不會(huì)受到影響。 (如果在調(diào)用 m.containsKey(k) 將在調(diào)用之前立即返回 true 時(shí)調(diào)用 m.put(k, v),則將鍵 k 重新插入到映射 m 中。)

此實(shí)現(xiàn)使其客戶免于 HashMap(和 Hashtable)提供的未指定的、通?;靵y的排序,而不會(huì)增加與 TreeMap 相關(guān)的成本。 無論原始 map 的實(shí)現(xiàn)如何,它都可用于生成與原始地圖具有相同順序的 map 副本:

     void foo(Map m) {
         Map copy = new LinkedHashMap(m);
         ...
     }

如果模塊在輸入上獲取映射,復(fù)制它,然后返回其順序由副本確定的結(jié)果,則此技術(shù)特別有用。 (客戶通常喜歡以與呈現(xiàn)相同的順序返回物品。)

提供了一個(gè)特殊的構(gòu)造函數(shù)來創(chuàng)建一個(gè)鏈接哈希映射,其迭代順序是其條目最后一次訪問的順序,從最近最少訪問到最近訪問(訪問順序)。 這種映射非常適合構(gòu)建 LRU 緩存。 調(diào)用 put、putIfAbsent、get、getOrDefault、compute、computeIfAbsent、computeIfPresent 或 merge 方法會(huì)導(dǎo)致對(duì)相應(yīng)條目的訪問(假設(shè)它在調(diào)用完成后存在)。 如果值被替換,replace 方法只會(huì)導(dǎo)致對(duì)條目的訪問。 putAll 方法為指定映射中的每個(gè)映射生成一個(gè)條目訪問,按照指定映射的條目集迭代器提供鍵值映射的順序。 沒有其他方法生成條目訪問。 特別是,collection-views 上的操作不會(huì)影響 backing map 的迭代順序。

可以重寫 removeEldestEntry(java.util.Map.Entry) 方法,以在將新映射添加到映射時(shí)自動(dòng)刪除陳舊映射的策略。

此類提供所有可選的 Map 操作,并允許 null 元素。 與 HashMap 一樣,它為基本操作(添加、包含和刪除)提供恒定時(shí)間性能,假設(shè)哈希函數(shù)在桶中正確地分散元素。 由于維護(hù)鏈表的額外費(fèi)用,性能可能略低于 HashMap,但有一個(gè)例外:迭代 LinkedHashMap 的集合視圖所需的時(shí)間與映射的大小成正比,而不管其容量如何 . HashMap 的迭代可能更昂貴,需要的時(shí)間與其容量成正比。

鏈接哈希圖有兩個(gè)影響其性能的參數(shù):初始容量和負(fù)載因子。 它們的定義與 HashMap 一樣。 但是請(qǐng)注意,對(duì)于此類而言,為初始容量選擇過高值的懲罰不如 HashMap 嚴(yán)重,因?yàn)榇祟惖牡鷷r(shí)間不受容量的影響。

請(qǐng)注意,此實(shí)現(xiàn)不同步。 如果多個(gè)線程同時(shí)訪問鏈接的哈希映射,并且至少有一個(gè)線程在結(jié)構(gòu)上修改映射,則必須在外部同步。 這通常是通過同步一些自然封裝 map 的對(duì)象來完成的。 如果不存在這樣的對(duì)象,則應(yīng)使用 Collections#synchronizedMap 方法“wrapped” map。 這最好在創(chuàng)建時(shí)完成,以防止對(duì) map 的意外不同步訪問:

   Map m = Collections.synchronizedMap(new LinkedHashMap(...));

結(jié)構(gòu)修改是添加或刪除一個(gè)或多個(gè)映射的任何操作,或者在訪問排序的鏈接哈希映射的情況下,影響迭代順序。 在插入排序的鏈接哈希映射中,僅更改與映射中已包含的鍵關(guān)聯(lián)的值不是結(jié)構(gòu)修改。 在按訪問順序鏈接的哈希映射中,僅使用 get 查詢映射是一種結(jié)構(gòu)修改。 )

由此類的所有集合視圖方法返回的集合的迭代器方法返回的迭代器是快速失敗的:如果在創(chuàng)建迭代器后的任何時(shí)間對(duì)映射進(jìn)行結(jié)構(gòu)修改,除了通過迭代器自己的 remove 方法之外的任何方式, 迭代器將拋出 ConcurrentModificationException。 因此,面對(duì)并發(fā)修改,迭代器快速而干凈地失敗,而不是在未來不確定的時(shí)間冒任意的、非確定性的行為。

請(qǐng)注意,不能保證迭代器的快速失敗行為,因?yàn)橐话銇碚f,在存在不同步的并發(fā)修改的情況下,不可能做出任何硬保證。 快速失敗的迭代器會(huì)盡最大努力拋出 ConcurrentModificationException。 因此,編寫一個(gè)依賴于這個(gè)異常的正確性的程序是錯(cuò)誤的:迭代器的快速失敗行為應(yīng)該只用于檢測(cè)錯(cuò)誤。

此類的所有集合視圖方法返回的集合的 spliterator 方法返回的拆分器是后期綁定的、快速失敗的,并且另外報(bào)告 Spliterator#ORDERED。

此類是 Java 集合框架的成員。

嵌套類摘要

從類 java.util.AbstractMap 繼承的嵌套類/接口
AbstractMap.SimpleEntryK,V, AbstractMap.SimpleImmutableEntryK,V
從接口 java.util.Map 繼承的嵌套類/接口
Map.EntryK,V

構(gòu)造函數(shù)摘要

構(gòu)造函數(shù) 描述
LinkedHashMap() 構(gòu)造一個(gè)具有默認(rèn)初始容量 (16) 和加載因子 (0.75) 的空插入排序 LinkedHashMap 實(shí)例。
LinkedHashMap(int initialCapacity) 構(gòu)造一個(gè)具有指定初始容量和默認(rèn)加載因子 (0.75) 的空插入排序 LinkedHashMap 實(shí)例。
LinkedHashMap(int initialCapacity, float loadFactor) 構(gòu)造一個(gè)具有指定初始容量和負(fù)載因子的空插入排序 LinkedHashMap 實(shí)例。
LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) 構(gòu)造一個(gè)具有指定初始容量、加載因子和排序模式的空 LinkedHashMap 實(shí)例。
LinkedHashMap(Map<? extends K,? extends V> m) 構(gòu)造一個(gè)插入順序的 LinkedHashMap 實(shí)例,其映射與指定的映射相同。

方法總結(jié)

修飾符和類型 方法 描述
void clear() 從此 map 中刪除所有映射。
boolean containsValue(Object value) 如果此映射將一個(gè)或多個(gè)鍵映射到指定值,則返回 true。
SetMap.EntryK,V entrySet() 返回此映射中包含的映射的 Set 視圖。
void forEach(BiConsumer<? super K,? super V> action) 對(duì)該映射中的每個(gè)條目執(zhí)行給定的操作,直到處理完所有條目或該操作引發(fā)異常。
V get(Object key) 返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回 null。
V getOrDefault(Object key, V defaultValue) 返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回 defaultValue。
SetK keySet() 返回此映射中包含的鍵的 Set 視圖。
protected boolean removeEldestEntry(Map.EntryK,V eldest) 如果此映射應(yīng)刪除其最舊的條目,則返回 true。
void replaceAll(BiFunction<? super K,? super V,? extends V> function) 將每個(gè)條目的值替換為對(duì)該條目調(diào)用給定函數(shù)的結(jié)果,直到所有條目都已處理或該函數(shù)引發(fā)異常。
CollectionV values() 返回此映射中包含的值的集合視圖。
從類 java.util.AbstractMap 繼承的方法
equals, hashCode, toString
從類 java.util.HashMap 繼承的方法
clone, compute, computeIfAbsent, computeIfPresent, containsKey, isEmpty, merge, put, putAll, putIfAbsent, remove, remove, replace, replace, size
從接口 java.util.Map 繼承的方法
compute, computeIfAbsent, computeIfPresent, containsKey, equals, hashCode, isEmpty, merge, put, putAll, putIfAbsent, remove, remove, replace, replace, size
從類 java.lang.Object 繼承的方法
finalize, getClass, notify, notifyAll, wait, wait, wait

構(gòu)造函數(shù)詳細(xì)信息

LinkedHashMap

public LinkedHashMap(int initialCapacity, float loadFactor)

構(gòu)造一個(gè)具有指定初始容量和負(fù)載因子的空插入排序 LinkedHashMap 實(shí)例。

參數(shù):

參數(shù)名稱 參數(shù)描述
initialCapacity 初始容量
loadFactor 負(fù)載系數(shù)

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果初始容量為負(fù)或負(fù)載因子為非正

LinkedHashMap

public LinkedHashMap(int initialCapacity)

構(gòu)造一個(gè)具有指定初始容量和默認(rèn)加載因子 (0.75) 的空插入排序 LinkedHashMap 實(shí)例。

參數(shù):

參數(shù)名稱 參數(shù)描述
initialCapacity 初始容量

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果初始容量為負(fù)

LinkedHashMap

public LinkedHashMap()

構(gòu)造一個(gè)具有默認(rèn)初始容量 (16) 和加載因子 (0.75) 的空插入排序 LinkedHashMap 實(shí)例。

LinkedHashMap

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

構(gòu)造一個(gè)插入順序的 LinkedHashMap 實(shí)例,其映射與指定的映射相同。 LinkedHashMap 實(shí)例是使用默認(rèn)加載因子 (0.75) 和足以在指定映射中保存映射的初始容量創(chuàng)建的。

參數(shù):

參數(shù)名稱 參數(shù)描述
m 其映射將放置在此 map 中的 map

Throws:

Throw名稱 Throw描述
NullPointerException 如果指定的 map 為空

LinkedHashMap

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

構(gòu)造一個(gè)具有指定初始容量、加載因子和排序模式的空 LinkedHashMap 實(shí)例。

參數(shù):

參數(shù)名稱 參數(shù)描述
initialCapacity 初始容量
loadFactor 負(fù)載系數(shù)
accessOrder 排序模式 - 訪問順序?yàn)?nbsp;true,插入順序?yàn)?nbsp;false

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果初始容量為負(fù)或負(fù)載因子為非正

方法詳情

containsValue

public boolean containsValue(Object value)

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

指定者:

接口 MapK,V 中的 containsValue

覆蓋:

HashMapK,V 類中的 containsValue

參數(shù):

參數(shù)名稱 參數(shù)描述
value 要測(cè)試其在此映射中的存在的值

返回:

如果此映射將一個(gè)或多個(gè)鍵映射到指定值,則為 true

get

public V get(Object key)

返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回 null。

更正式地說,如果此映射包含從鍵 k 到值 v 的映射,使得 (key==null ? k==null : key.equals(k)),則此方法返回 v; 否則返回null。 (最多可以有一個(gè)這樣的映射。)

返回值為 null 并不一定表示該映射不包含該鍵的映射; 映射也可能將鍵顯式映射為空。 containsKey 操作可用于區(qū)分這兩種情況。

指定者:

進(jìn)入接口 MapK,V

覆蓋:

進(jìn)入類 HashMapK,V

參數(shù):

參數(shù)名稱 參數(shù)描述
key 要返回其關(guān)聯(lián)值的鍵

返回:

指定鍵映射到的值,如果此映射不包含該鍵的映射,則為 null

getOrDefault

public V getOrDefault(Object key, V defaultValue)

返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回 defaultValue。

指定者:

接口 MapK,V 中的 getOrDefault

覆蓋:

HashMapK,V 類中的 getOrDefault

參數(shù):

參數(shù)名稱 參數(shù)描述
key 要返回其關(guān)聯(lián)值的鍵
defaultValue 鍵的默認(rèn)映射

返回:

指定鍵映射到的值,如果此映射不包含該鍵的映射,則為 defaultValue

clear

public void clear()

從此 map 中刪除所有映射。 此調(diào)用返回后,map 將為空。

指定者:

在界面 MapK,V 中清除

覆蓋:

在類 HashMapK,V 中清除

removeEldestEntry

protected boolean removeEldestEntry(Map.EntryK,V eldest)

如果此映射應(yīng)刪除其最舊的條目,則返回 true。 在將新條目插入映射后,put 和 putAll 調(diào)用此方法。 它為實(shí)現(xiàn)者提供了在每次添加新條目時(shí)刪除最舊條目的機(jī)會(huì)。 如果映射表示緩存,這很有用:它允許映射通過刪除過時(shí)的條目來減少內(nèi)存消耗。

示例使用:此覆蓋將允許映射增長(zhǎng)到 100 個(gè)條目,然后在每次添加新條目時(shí)刪除最舊的條目,保持 100 個(gè)條目的穩(wěn)定狀態(tài)。

     private static final int MAX_ENTRIES = 100;


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

此方法通常不會(huì)以任何方式修改映射,而是允許映射按照其返回值的指示修改自身。 此方法允許直接修改 map,但如果這樣做,它必須返回 false(表示 map 不應(yīng)嘗試任何進(jìn)一步的修改)。 未指定在此方法中修改 map 后返回 true 的效果。

此實(shí)現(xiàn)僅返回 false(因此此貼圖的作用類似于法線貼圖 - 永遠(yuǎn)不會(huì)刪除最老的元素)。

參數(shù):

參數(shù)名稱 參數(shù)描述
eldest 映射中最近最少插入的條目,或者如果這是按訪問排序的映射,則為最近最少訪問的條目。 這是將被刪除的條目,此方法返回 true。 如果在 put 或 putAll 調(diào)用導(dǎo)致此調(diào)用之前映射為空,則這將是剛剛插入的條目; 換句話說,如果映射包含單個(gè)條目,則最舊的條目也是最新的。

返回:

如果應(yīng)該從 map 中刪除最舊的條目,則為 true; 如果應(yīng)該保留它,則為 false。

keySet

public SetK keySet()

返回此映射中包含的鍵的 Set 視圖。 集合由 map 支持,因此對(duì) map 的更改會(huì)反映在集合中,反之亦然。 如果在對(duì)集合進(jìn)行迭代時(shí)修改了映射(通過迭代器自己的刪除操作除外),則迭代的結(jié)果是不確定的。 該集合支持元素移除,即通過 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作從映射中移除相應(yīng)的映射。 它不支持 add 或 addAll 操作。 它的 Spliterator 通常提供更快的順序性能,但比 HashMap 的并行性能差得多。

指定者:

接口 MapK,V 中的 keySet

覆蓋:

HashMapK,V 類中的 keySet

返回:

此 map 中包含的鍵的集合視圖

values

public CollectionV values()

返回此映射中包含的值的集合視圖。 集合由 map 支持,因此對(duì) map 的更改會(huì)反映在集合中,反之亦然。 如果在對(duì)集合進(jìn)行迭代時(shí)修改了映射(通過迭代器自己的刪除操作除外),則迭代的結(jié)果是不確定的。 該集合支持元素移除,即通過 Iterator.remove、Collection.remove、removeAll、retainAll 和 clear 操作從映射中移除相應(yīng)的映射。 它不支持 add 或 addAll 操作。 它的 Spliterator 通常提供更快的順序性能,但比 HashMap 的并行性能差得多。

指定者:

接口 MapK,V 中的值

覆蓋:

HashMapK,V 類中的值

返回:

此 map 中包含的值的視圖

entrySet

public SetMap.EntryK,V entrySet()

返回此映射中包含的映射的 Set 視圖。 集合由 map 支持,因此對(duì) map 的更改會(huì)反映在集合中,反之亦然。 如果在對(duì)集合進(jìn)行迭代時(shí)修改了映射(除了通過迭代器自己的刪除操作,或通過迭代器返回的映射條目上的 setValue 操作),則迭代的結(jié)果是未定義的。 該集合支持元素移除,即通過 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作從映射中移除相應(yīng)的映射。 它不支持 add 或 addAll 操作。 它的 Spliterator 通常提供更快的順序性能,但比 HashMap 的并行性能差得多。

指定者:

接口 MapK,V 中的 entrySet

覆蓋:

HashMapK,V 類中的 entrySet

返回:

此 map 中包含的映射的集合視圖

forEach

public void forEach(BiConsumer<? super K,? super V> action)

從接口復(fù)制的描述:map

對(duì)該映射中的每個(gè)條目執(zhí)行給定的操作,直到處理完所有條目或該操作引發(fā)異常。 除非實(shí)現(xiàn)類另有規(guī)定,否則按照條目集迭代的順序執(zhí)行動(dòng)作(如果指定了迭代順序)。動(dòng)作拋出的異常將轉(zhuǎn)發(fā)給調(diào)用者。

指定者:

接口 MapK,V 中的 forEach

覆蓋:

HashMapK,V 類中的 forEach

參數(shù):

參數(shù)名稱 參數(shù)描述
action 為每個(gè)條目執(zhí)行的操作

replaceAll

public void replaceAll(BiFunction<? super K,? super V,? extends V> function)

從接口復(fù)制的描述:map

將每個(gè)條目的值替換為對(duì)該條目調(diào)用給定函數(shù)的結(jié)果,直到所有條目都已處理或該函數(shù)引發(fā)異常。 函數(shù)拋出的異常被轉(zhuǎn)發(fā)給調(diào)用者。

指定者:

接口 MapK,V 中的 replaceAll

覆蓋:

類 HashMapK,V 中的 replaceAll

參數(shù):

參數(shù)名稱 參數(shù)描述
function 應(yīng)用于每個(gè)條目的函數(shù)
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)