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 | 应用于每个条目的函数 |