阅读(2479) (9)

鸿蒙OS WeakHashMap

2022-06-16 16:31:17 更新

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 接口的基于哈希表的实现,带有弱键。 WeakHashMap 中的条目在其键不再常用时将被自动删除。 更准确地说,给定键的映射的存在不会阻止该键被垃圾收集器丢弃,也就是说,使其可终结,最终确定,然后回收。 当一个键被丢弃时,它的条目被有效地从映射中删除,所以这个类的行为与其他映射实现有些不同。

支持空值和空键。 该类具有与HashMap类相似的性能特点,并且具有相同的初始容量和负载因子的效率参数。

像大多数集合类一样,这个类是不同步的。 可以使用 Collections#synchronizedMap 方法构造同步的 WeakHashMap。

此类主要用于关键对象,其 equals 方法使用 == 运算符测试对象身份。 一旦这样的键被丢弃,它就永远无法重新创建,因此以后不可能在 WeakHashMap 中查找该键并惊讶于它的条目已被删除。 此类将非常适用于其 equals 方法不基于对象标识的关键对象,例如 String 实例。 然而,使用这种可重新创建的键对象,自动删除键已被丢弃的 WeakHashMap 条目可能会令人困惑。

WeakHashMap 类的行为部分取决于垃圾收集器的行为,因此一些熟悉的(尽管不是必需的)Map 不变量不适用于此类。 因为垃圾收集器可能随时丢弃键,所以 WeakHashMap 可能表现得好像一个未知线程正在默默地删除条目。 特别是,即使您在 WeakHashMap 实例上进行同步并且不调用它的任何 mutator 方法,size 方法也有可能随着时间的推移返回较小的值,isEmpty 方法返回 false 然后返回 true,containsKey 方法返回 给定键的 true 和 false,get 方法返回给定键的值,但稍后返回 null,put 方法返回 null,remove 方法返回 false,之前出现在 映射,并用于对键集、值集合和条目集的连续检查,以产生连续较少数量的元素。

WeakHashMap 中的每个键对象都间接存储为弱引用的所指对象。 因此,只有在映射内部和外部的弱引用已被垃圾收集器清除后,才会自动删除键。

实现说明:WeakHashMap 中的值对象由普通的强引用保存。 因此,应注意确保值对象不会直接或间接地强烈引用它们自己的键,因为这将防止键被丢弃。 请注意,值对象可以通过 WeakHashMap 本身间接引用其键; 也就是说,一个值对象可以强引用某个其他键对象,其关联的值对象反过来又强引用第一个值对象的键。 如果映射中的值不依赖于持有对它们的强引用的映射,解决此问题的一种方法是在插入之前将值本身包装在 WeakReferences 中,如:m.put(key, new WeakReference(value)), 然后在每次获取时打开包装。

由此类的所有“集合视图方法”返回的集合的迭代器方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间对映射进行结构修改,除了通过迭代器自己的删除之外的任何方式 方法,迭代器将抛出 ConcurrentModificationException。 因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。

请注意,不能保证迭代器的快速失败行为,因为一般来说,在存在不同步的并发修改的情况下,不可能做出任何硬保证。 快速失败的迭代器会尽最大努力抛出 ConcurrentModificationException。 因此,编写一个依赖于这个异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测错误。

此类是 Java 集合框架的成员。

嵌套类摘要

从类 java.util.AbstractMap 继承的嵌套类/接口
AbstractMap.SimpleEntryK,V, AbstractMap.SimpleImmutableEntryK,V
从接口 java.util.Map 继承的嵌套类/接口
Map.EntryK,V

构造函数摘要

构造函数 描述
WeakHashMap() 构造一个具有默认初始容量 (16) 和加载因子 (0.75) 的新的空 WeakHashMap。
WeakHashMap(int initialCapacity) 使用给定的初始容量和默认加载因子 (0.75) 构造一个新的空 WeakHashMap。
WeakHashMap(int initialCapacity, float loadFactor) 使用给定的初始容量和给定的负载因子构造一个新的空 WeakHashMap。
WeakHashMap(Map<? extends K,? extends V> m) 构造一个与指定映射具有相同映射的新 WeakHashMap。

方法总结

修饰符和类型 方法 描述
void clear() 从此 map 中删除所有映射。
boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回 true。
boolean containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。
SetMap.EntryK,V entrySet() 返回此映射中包含的映射的 Set 视图。
void forEach(BiConsumer<? super K,? super V> action) 对该映射中的每个条目执行给定的操作,直到处理完所有条目或该操作引发异常。
V get(Object key) 返回指定键映射到的值,如果此映射不包含该键的映射,则返回 null。
boolean isEmpty() 如果此映射不包含键值映射,则返回 true。
SetK keySet() 返回此映射中包含的键的 Set 视图。
V put(K key, V value) 将指定的值与此映射中的指定键相关联。
void putAll(Map<? extends K,? extends V> m) 将所有映射从指定映射复制到此映射。
V remove(Object key) 如果存在,则从此弱哈希映射中删除键的映射。
void replaceAll(BiFunction<? super K,? super V,? extends V> function) 将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都已处理或该函数引发异常。
int size() 返回此映射中键值映射的数量。
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

构造函数详细信息

WeakHashMap

public WeakHashMap(int initialCapacity, float loadFactor)

使用给定的初始容量和给定的负载因子构造一个新的空 WeakHashMap。

参数:

参数名称 参数描述
initialCapacity WeakHashMap的初始容量
loadFactor WeakHashMap 的负载因子

Throws:

Throw名称 Throw描述
IllegalArgumentException 如果初始容量为负数,或者负载因子为非正数。

WeakHashMap

public WeakHashMap(int initialCapacity)

使用给定的初始容量和默认加载因子 (0.75) 构造一个新的空 WeakHashMap。

参数:

参数名称 参数描述
initialCapacity WeakHashMap的初始容量

Throws:

Throw名称 Throw描述
IllegalArgumentException 如果初始容量为负

WeakHashMap

public WeakHashMap()

构造一个具有默认初始容量 (16) 和加载因子 (0.75) 的新的空 WeakHashMap。

WeakHashMap

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

构造一个与指定映射具有相同映射的新 WeakHashMap。 WeakHashMap 是使用默认加载因子 (0.75) 和足以在指定映射中保存映射的初始容量创建的。

参数:

参数名称 参数描述
m 其映射将放置在此 map 中的 map

Throws:

Throw名称 Throw描述
NullPointerException 如果指定的 map 为空

方法详情

size

public int size()

返回此映射中键值映射的数量。 此结果是一个快照,可能不会反映在下次尝试访问之前将被删除的未处理条目,因为它们不再被引用。

指定者:

接口 MapK,V 中的大小

覆盖:

AbstractMapK,V 类中的大小

返回:

此映射中的键值映射的数量

isEmpty

public boolean isEmpty()

如果此映射不包含键值映射,则返回 true。 此结果是一个快照,可能不会反映在下次尝试访问之前将被删除的未处理条目,因为它们不再被引用。

指定者:

接口 MapK,V 中的 isEmpty

覆盖:

AbstractMapK,V 类中的 isEmpty

返回:

如果此映射不包含键值映射,则为 true

get

public V get(Object key)

返回指定键映射到的值,如果此映射不包含该键的映射,则返回 null。

更正式地说,如果此映射包含从键 k 到值 v 的映射,使得 (key==null ? k==null : key.equals(k)),则此方法返回 v; 否则返回null。 (最多可以有一个这样的映射。)

返回值为 null 并不一定表示该映射不包含该键的映射; 映射也可能将键显式映射为空。 containsKey 操作可用于区分这两种情况。

指定者:

进入接口 MapK,V

覆盖:

进入类 AbstractMapK,V

参数:

参数名称 参数描述
key 要返回其关联值的键

返回:

指定键映射到的值,如果此映射不包含该键的映射,则为 null

containsKey

public boolean containsKey(Object key)

如果此映射包含指定键的映射,则返回 true。

指定者:

containsKey 在接口 MapK,V

覆盖:

类 AbstractMapK,V 中的 containsKey

参数:

参数名称 参数描述
key 要测试在此映射中是否存在的键

返回:

如果存在键映射,则为 true; 否则为 false

put

public V put(K key, V value)

将指定的值与此映射中的指定键相关联。 如果映射先前包含此键的映射,则替换旧值。

指定者:

放入接口 MapK,V

覆盖:

放入类 AbstractMapK,V

参数:

参数名称 参数描述
key 与指定值关联的键。
value 与指定键关联的值。

返回:

与 key 关联的前一个值,如果没有 key 映射,则返回 null。 (返回 null 还可以指示映射先前将 null 与 key 关联。)

putAll

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

将所有映射从指定映射复制到此映射。 这些映射将替换此映射对当前指定映射中的任何键的任何映射。

指定者:

putAll在接口MapK,V中

覆盖:

putAll 在类 AbstractMapK,V

参数:

参数名称 参数描述
m 要存储在此映射中的映射。

Throws:

Throw名称 Throw描述
NullPointerException 如果指定的 map 为空。

remove

public V remove(Object key)

如果存在,则从此弱哈希映射中删除键的映射。 更正式地说,如果此映射包含从键 k 到值 v 的映射,使得 (key==null ? k==null : key.equals(k)),则删除该映射。 (地图最多可以包含一个这样的映射。)

返回此映射先前与键关联的值,如果映射不包含键的映射,则返回 null。 返回值为 null 并不一定表示该映射不包含该键的映射; map 也有可能将键显式映射为空。

一旦调用返回,映射将不包含指定键的映射。

指定者:

在接口 MapK,V 中移除

覆盖:

在类 AbstractMapK,V 中删除

参数:

参数名称 参数描述
key 要从映射中删除其映射的键

返回:

与键关联的前一个值,如果没有键映射,则返回 null

clear

public void clear()

从此 map 中删除所有映射。 此调用返回后,map 将为空。

指定者:

在界面 MapK,V 中清除

覆盖:

在类 AbstractMapK,V 中清除

containsValue

public boolean containsValue(Object value)

如果此映射将一个或多个键映射到指定值,则返回 true。

指定者:

接口 MapK,V 中的 containsValue

覆盖:

类 AbstractMapK,V 中的 containsValue

参数:

参数名称 参数描述
value 要测试其在此映射中的存在的值

返回:

如果此映射将一个或多个键映射到指定值,则为 true

keySet

public SetK keySet()

返回此映射中包含的键的 Set 视图。 集合由 map 支持,因此对 map 的更改会反映在集合中,反之亦然。 如果在对集合进行迭代时修改了映射(通过迭代器自己的删除操作除外),则迭代的结果是不确定的。 该集合支持元素移除,即通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作从映射中移除相应的映射。 它不支持 add 或 addAll 操作。

指定者:

接口 MapK,V 中的 keySet

覆盖:

AbstractMapK,V 类中的 keySet

返回:

此 map 中包含的键的集合视图

values

public CollectionV values()

返回此映射中包含的值的集合视图。 集合由 map 支持,因此对 map 的更改会反映在集合中,反之亦然。 如果在对集合进行迭代时修改了映射(通过迭代器自己的删除操作除外),则迭代的结果是不确定的。 该集合支持元素移除,即通过 Iterator.remove、Collection.remove、removeAll、retainAll 和 clear 操作从映射中移除相应的映射。 它不支持 add 或 addAll 操作。

指定者:

接口 MapK,V 中的值

覆盖:

AbstractMapK,V 类中的值

返回:

此 map 中包含的值的集合视图

entrySet

public SetMap.EntryK,V entrySet()

返回此映射中包含的映射的 Set 视图。 集合由 map 支持,因此对 map 的更改会反映在集合中,反之亦然。 如果在对集合进行迭代时修改了映射(通过迭代器自己的删除操作或通过迭代器返回的映射条目上的 setValue 操作除外),则迭代的结果是未定义的。 该集合支持元素移除,即通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作从映射中移除相应的映射。 它不支持 add 或 addAll 操作。

指定者:

接口 MapK,V 中的 entrySet

指定者:

AbstractMapK,V 类中的 entrySet

返回:

此 map 中包含的映射的集合视图

forEach

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

从接口复制的描述:map

对该映射中的每个条目执行给定的操作,直到处理完所有条目或该操作引发异常。 除非实现类另有规定,否则按照条目集迭代的顺序执行动作(如果指定了迭代顺序)。动作抛出的异常将转发给调用者。

指定者:

接口 MapK,V 中的 forEach

参数:

参数名称 参数描述
action 为每个条目执行的操作

replaceAll

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

从接口复制的描述:map

将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都已处理或该函数引发异常。 函数抛出的异常被转发给调用者。

指定者:

接口 MapK,V 中的 replaceAll

参数:

参数名称 参数描述
function 应用于每个条目的函数