鴻蒙OS WeakHashMap

2022-08-11 16:18 更新

WeakHashMap

java.lang.Object

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

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

public class WeakHashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>

Map 接口的基于哈希表的實(shí)現(xiàn),帶有弱鍵。 WeakHashMap 中的條目在其鍵不再常用時(shí)將被自動(dòng)刪除。 更準(zhǔn)確地說(shuō),給定鍵的映射的存在不會(huì)阻止該鍵被垃圾收集器丟棄,也就是說(shuō),使其可終結(jié),最終確定,然后回收。 當(dāng)一個(gè)鍵被丟棄時(shí),它的條目被有效地從映射中刪除,所以這個(gè)類的行為與其他映射實(shí)現(xiàn)有些不同。

支持空值和空鍵。 該類具有與HashMap類相似的性能特點(diǎn),并且具有相同的初始容量和負(fù)載因子的效率參數(shù)。

像大多數(shù)集合類一樣,這個(gè)類是不同步的。 可以使用 Collections#synchronizedMap 方法構(gòu)造同步的 WeakHashMap。

此類主要用于關(guān)鍵對(duì)象,其 equals 方法使用 == 運(yùn)算符測(cè)試對(duì)象身份。 一旦這樣的鍵被丟棄,它就永遠(yuǎn)無(wú)法重新創(chuàng)建,因此以后不可能在 WeakHashMap 中查找該鍵并驚訝于它的條目已被刪除。 此類將非常適用于其 equals 方法不基于對(duì)象標(biāo)識(shí)的關(guān)鍵對(duì)象,例如 String 實(shí)例。 然而,使用這種可重新創(chuàng)建的鍵對(duì)象,自動(dòng)刪除鍵已被丟棄的 WeakHashMap 條目可能會(huì)令人困惑。

WeakHashMap 類的行為部分取決于垃圾收集器的行為,因此一些熟悉的(盡管不是必需的)Map 不變量不適用于此類。 因?yàn)槔占骺赡茈S時(shí)丟棄鍵,所以 WeakHashMap 可能表現(xiàn)得好像一個(gè)未知線程正在默默地刪除條目。 特別是,即使您在 WeakHashMap 實(shí)例上進(jìn)行同步并且不調(diào)用它的任何 mutator 方法,size 方法也有可能隨著時(shí)間的推移返回較小的值,isEmpty 方法返回 false 然后返回 true,containsKey 方法返回 給定鍵的 true 和 false,get 方法返回給定鍵的值,但稍后返回 null,put 方法返回 null,remove 方法返回 false,之前出現(xiàn)在 映射,并用于對(duì)鍵集、值集合和條目集的連續(xù)檢查,以產(chǎn)生連續(xù)較少數(shù)量的元素。

WeakHashMap 中的每個(gè)鍵對(duì)象都間接存儲(chǔ)為弱引用的所指對(duì)象。 因此,只有在映射內(nèi)部和外部的弱引用已被垃圾收集器清除后,才會(huì)自動(dòng)刪除鍵。

實(shí)現(xiàn)說(shuō)明:WeakHashMap 中的值對(duì)象由普通的強(qiáng)引用保存。 因此,應(yīng)注意確保值對(duì)象不會(huì)直接或間接地強(qiáng)烈引用它們自己的鍵,因?yàn)檫@將防止鍵被丟棄。 請(qǐng)注意,值對(duì)象可以通過(guò) WeakHashMap 本身間接引用其鍵; 也就是說(shuō),一個(gè)值對(duì)象可以強(qiáng)引用某個(gè)其他鍵對(duì)象,其關(guān)聯(lián)的值對(duì)象反過(guò)來(lái)又強(qiáng)引用第一個(gè)值對(duì)象的鍵。 如果映射中的值不依賴于持有對(duì)它們的強(qiáng)引用的映射,解決此問(wèn)題的一種方法是在插入之前將值本身包裝在 WeakReferences 中,如:m.put(key, new WeakReference(value)), 然后在每次獲取時(shí)打開(kāi)包裝。

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

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

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

嵌套類摘要

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

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

構(gòu)造函數(shù) 描述
WeakHashMap() 構(gòu)造一個(gè)具有默認(rèn)初始容量 (16) 和加載因子 (0.75) 的新的空 WeakHashMap。
WeakHashMap(int initialCapacity) 使用給定的初始容量和默認(rèn)加載因子 (0.75) 構(gòu)造一個(gè)新的空 WeakHashMap。
WeakHashMap(int initialCapacity, float loadFactor) 使用給定的初始容量和給定的負(fù)載因子構(gòu)造一個(gè)新的空 WeakHashMap。
WeakHashMap(Map<? extends K,? extends V> m) 構(gòu)造一個(gè)與指定映射具有相同映射的新 WeakHashMap。

方法總結(jié)

修飾符和類型 方法 描述
void clear() 從此 map 中刪除所有映射。
boolean containsKey(Object key) 如果此映射包含指定鍵的映射,則返回 true。
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。
boolean isEmpty() 如果此映射不包含鍵值映射,則返回 true。
SetK keySet() 返回此映射中包含的鍵的 Set 視圖。
V put(K key, V value) 將指定的值與此映射中的指定鍵相關(guān)聯(lián)。
void putAll(Map<? extends K,? extends V> m) 將所有映射從指定映射復(fù)制到此映射。
V remove(Object key) 如果存在,則從此弱哈希映射中刪除鍵的映射。
void replaceAll(BiFunction<? super K,? super V,? extends V> function) 將每個(gè)條目的值替換為對(duì)該條目調(diào)用給定函數(shù)的結(jié)果,直到所有條目都已處理或該函數(shù)引發(fā)異常。
int size() 返回此映射中鍵值映射的數(shù)量。
CollectionV values() 返回此映射中包含的值的集合視圖。
從類 java.util.AbstractMap 繼承的方法
clone, equals, hashCode, toString
從接口 java.util.Map 繼承的方法
compute, computeIfAbsent, computeIfPresent, equals, getOrDefault, hashCode, merge, putIfAbsent, remove, replace, replace
從類 java.lang.Object 繼承的方法
finalize, getClass, notify, notifyAll, wait, wait, wait

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

WeakHashMap

public WeakHashMap(int initialCapacity, float loadFactor)

使用給定的初始容量和給定的負(fù)載因子構(gòu)造一個(gè)新的空 WeakHashMap。

參數(shù):

參數(shù)名稱 參數(shù)描述
initialCapacity WeakHashMap的初始容量
loadFactor WeakHashMap 的負(fù)載因子

Throws:

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

WeakHashMap

public WeakHashMap(int initialCapacity)

使用給定的初始容量和默認(rèn)加載因子 (0.75) 構(gòu)造一個(gè)新的空 WeakHashMap。

參數(shù):

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

Throws:

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

WeakHashMap

public WeakHashMap()

構(gòu)造一個(gè)具有默認(rèn)初始容量 (16) 和加載因子 (0.75) 的新的空 WeakHashMap。

WeakHashMap

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

構(gòu)造一個(gè)與指定映射具有相同映射的新 WeakHashMap。 WeakHashMap 是使用默認(rèn)加載因子 (0.75) 和足以在指定映射中保存映射的初始容量創(chuàng)建的。

參數(shù):

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

Throws:

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

方法詳情

size

public int size()

返回此映射中鍵值映射的數(shù)量。 此結(jié)果是一個(gè)快照,可能不會(huì)反映在下次嘗試訪問(wèn)之前將被刪除的未處理?xiàng)l目,因?yàn)樗鼈儾辉俦灰谩?/p>

指定者:

接口 MapK,V 中的大小

覆蓋:

AbstractMapK,V 類中的大小

返回:

此映射中的鍵值映射的數(shù)量

isEmpty

public boolean isEmpty()

如果此映射不包含鍵值映射,則返回 true。 此結(jié)果是一個(gè)快照,可能不會(huì)反映在下次嘗試訪問(wèn)之前將被刪除的未處理?xiàng)l目,因?yàn)樗鼈儾辉俦灰谩?/p>

指定者:

接口 MapK,V 中的 isEmpty

覆蓋:

AbstractMapK,V 類中的 isEmpty

返回:

如果此映射不包含鍵值映射,則為 true

get

public V get(Object key)

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

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

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

指定者:

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

覆蓋:

進(jìn)入類 AbstractMapK,V

參數(shù):

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

返回:

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

containsKey

public boolean containsKey(Object key)

如果此映射包含指定鍵的映射,則返回 true。

指定者:

containsKey 在接口 MapK,V

覆蓋:

類 AbstractMapK,V 中的 containsKey

參數(shù):

參數(shù)名稱 參數(shù)描述
key 要測(cè)試在此映射中是否存在的鍵

返回:

如果存在鍵映射,則為 true; 否則為 false

put

public V put(K key, V value)

將指定的值與此映射中的指定鍵相關(guān)聯(lián)。 如果映射先前包含此鍵的映射,則替換舊值。

指定者:

放入接口 MapK,V

覆蓋:

放入類 AbstractMapK,V

參數(shù):

參數(shù)名稱 參數(shù)描述
key 與指定值關(guān)聯(lián)的鍵。
value 與指定鍵關(guān)聯(lián)的值。

返回:

與 key 關(guān)聯(lián)的前一個(gè)值,如果沒(méi)有 key 映射,則返回 null。 (返回 null 還可以指示映射先前將 null 與 key 關(guān)聯(lián)。)

putAll

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

將所有映射從指定映射復(fù)制到此映射。 這些映射將替換此映射對(duì)當(dāng)前指定映射中的任何鍵的任何映射。

指定者:

putAll在接口MapK,V中

覆蓋:

putAll 在類 AbstractMapK,V

參數(shù):

參數(shù)名稱 參數(shù)描述
m 要存儲(chǔ)在此映射中的映射。

Throws:

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

remove

public V remove(Object key)

如果存在,則從此弱哈希映射中刪除鍵的映射。 更正式地說(shuō),如果此映射包含從鍵 k 到值 v 的映射,使得 (key==null ? k==null : key.equals(k)),則刪除該映射。 (地圖最多可以包含一個(gè)這樣的映射。)

返回此映射先前與鍵關(guān)聯(lián)的值,如果映射不包含鍵的映射,則返回 null。 返回值為 null 并不一定表示該映射不包含該鍵的映射; map 也有可能將鍵顯式映射為空。

一旦調(diào)用返回,映射將不包含指定鍵的映射。

指定者:

在接口 MapK,V 中移除

覆蓋:

在類 AbstractMapK,V 中刪除

參數(shù):

參數(shù)名稱 參數(shù)描述
key 要從映射中刪除其映射的鍵

返回:

與鍵關(guān)聯(lián)的前一個(gè)值,如果沒(méi)有鍵映射,則返回 null

clear

public void clear()

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

指定者:

在界面 MapK,V 中清除

覆蓋:

在類 AbstractMapK,V 中清除

containsValue

public boolean containsValue(Object value)

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

指定者:

接口 MapK,V 中的 containsValue

覆蓋:

類 AbstractMapK,V 中的 containsValue

參數(shù):

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

返回:

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

keySet

public SetK keySet()

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

指定者:

接口 MapK,V 中的 keySet

覆蓋:

AbstractMapK,V 類中的 keySet

返回:

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

values

public CollectionV values()

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

指定者:

接口 MapK,V 中的值

覆蓋:

AbstractMapK,V 類中的值

返回:

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

entrySet

public SetMap.EntryK,V entrySet()

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

指定者:

接口 MapK,V 中的 entrySet

指定者:

AbstractMapK,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

參數(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

參數(shù):

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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)