- 类型参数:
K- 此map维护的键类型V- 映射值的类型
- 所有已实现的接口:
Map<K,V>
Map 接口的基于哈希表的实现,带有 weak keys 。 WeakHashMap 中的条目在其密钥不再正常使用时将自动删除。更准确地说,给定键的映射的存在不会阻止该键被垃圾收集器丢弃,即使其可终结、终结,然后回收。当一个键被丢弃时,它的条目实际上从map中删除,所以这个类的行为与其他 Map 实现有些不同。
支持空值和空键。此类具有与 HashMap 类相似的性能特征,并具有与 initial capacity 和 load factor 相同的效率参数。
与大多数集合类一样,此类不是同步的。可以使用 Collections.synchronizedMap 方法构造同步的 WeakHashMap。
此类主要用于其 equals 方法使用 == 运算符测试对象身份的关键对象。一旦这样的密钥被丢弃,它就永远无法重新创建,因此以后不可能在 WeakHashMap 中查找该密钥并惊讶于它的条目已被删除。此类将与 equals 方法不基于对象身份的关键对象完美配合,例如 String 实例。然而,对于此类可重新创建的密钥对象,自动删除其密钥已被丢弃的 WeakHashMap 条目可能会令人困惑。
WeakHashMap 类的行为部分取决于垃圾收集器的操作,因此几个熟悉的(虽然不是必需的)Map 不变量不适用于此类。因为垃圾收集器可能随时丢弃键,WeakHashMap 可能表现得好像未知线程正在静默删除条目。特别是,即使您在 WeakHashMap 实例上同步并且不调用它的任何增变器方法,随着时间的推移,size 方法也可能返回较小的值,isEmpty 方法返回 false,然后返回 true,containsKey 方法返回true 和后来的 false 对于给定的键,对于 get 方法返回给定键的值但稍后返回 null ,对于 put 方法返回 null 和 remove 方法返回 false 对于以前出现在映射,以及对键集、值集合和条目集的连续检查,以产生连续较少数量的元素。
WeakHashMap 中的每个键对象都间接存储为弱引用的引用对象。因此,只有在map内部和外部对其的弱引用已被垃圾收集器清除后,才会自动删除该键。
Implementation note: WeakHashMap 中的值对象由普通强引用持有。因此,应该注意确保值对象不会直接或间接地强引用它们自己的键,因为这将防止键被丢弃。请注意,值对象可以通过 WeakHashMap 本身间接引用其键;也就是说,一个值对象可能会强引用一些其他键对象,而这些键对象的关联值对象又会强引用第一个值对象的键。如果map中的值不依赖于持有对它们的强引用的map,处理此问题的一种方法是在插入之前将值本身包装在 WeakReferences 中,如: m.put(key, new WeakReference(value)) ,然后在每个 get 上展开。
该类所有“集合视图方法”返回的集合的iterator方法返回的迭代器是快速失败:如果在创建迭代器后的任何时间以任何方式修改map的结构,除了通过迭代器自己的 remove 方法,迭代器将抛出一个 ConcurrentModificationException 。因此,面对并发修改,迭代器会快速干净地失败,而不是冒着在未来不确定的时间出现任意的、不确定的行为的风险。
请注意,无法保证迭代器的快速失败行为,因为一般来说,在存在非同步并发修改的情况下不可能做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,编写依赖于此异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测错误。
此类是 Java 集合框架 的成员。
- 自从:
- 1.2
- 参见:
-
内部类总结
在类 java.util.AbstractMap 中声明的嵌套类/接口
AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K, V> -
构造方法总结
构造方法构造方法描述使用默认初始容量 (16) 和负载因子 (0.75) 构造一个新的空WeakHashMap。WeakHashMap(int initialCapacity) 使用给定的初始容量和默认负载因子 (0.75) 构造一个新的空WeakHashMap。WeakHashMap(int initialCapacity, float loadFactor) 使用给定的初始容量和给定的负载因子构造一个新的空WeakHashMap。WeakHashMap(Map<? extends K, ? extends V> m) 使用与指定map相同的映射构造一个新的WeakHashMap。 -
方法总结
修饰符和类型方法描述voidclear()从此map中删除所有映射。booleancontainsKey(Object key) 如果此map包含指定键的映射,则返回true。booleancontainsValue(Object value) 如果此map将一个或多个键映射到指定值,则返回true。entrySet()返回此map中包含的映射的Set视图。返回指定键映射到的值,如果此map不包含键的映射,则返回null。booleanisEmpty()如果此map不包含键值映射,则返回true。keySet()返回此map中包含的键的Set视图。static <K,V> WeakHashMap<K, V> newWeakHashMap(int numMappings) 创建一个适合预期映射数量的新的空 WeakHashMap。将指定值与此map中的指定键相关联。void将指定map中的所有值复制到此map。如果存在,则从此弱hash map中删除键的映射。intsize()返回此map中键值映射的数量。values()返回此map中包含的值的Collection视图。在类 java.util.AbstractMap 中声明的方法
clone, equals, hashCode, toString在接口 java.util.Map 中声明的方法
compute, computeIfAbsent, computeIfPresent, equals, forEach, getOrDefault, hashCode, merge, putIfAbsent, remove, replace, replace, replaceAll
-
构造方法详细信息
-
WeakHashMap
public WeakHashMap(int initialCapacity, float loadFactor) 使用给定的初始容量和给定的负载因子构造一个新的空WeakHashMap。- API 注意:
-
要创建初始容量可容纳预期映射数量的
WeakHashMap,请使用newWeakHashMap。 - 参数:
initialCapacity-WeakHashMap的初始容量loadFactor-WeakHashMap的负载系数- 抛出:
IllegalArgumentException- 如果初始容量为负,或者负载因子为非正。
-
WeakHashMap
public WeakHashMap(int initialCapacity) 使用给定的初始容量和默认负载因子 (0.75) 构造一个新的空WeakHashMap。- API 注意:
-
要创建初始容量可容纳预期映射数量的
WeakHashMap,请使用newWeakHashMap。 - 参数:
initialCapacity-WeakHashMap的初始容量- 抛出:
IllegalArgumentException- 如果初始容量为负
-
WeakHashMap
public WeakHashMap()使用默认初始容量 (16) 和负载因子 (0.75) 构造一个新的空WeakHashMap。 -
WeakHashMap
使用与指定map相同的映射构造一个新的WeakHashMap。WeakHashMap是使用默认加载因子 (0.75) 和足以容纳指定map中的映射的初始容量创建的。- 参数:
m- 其映射要放置在此map中的map- 抛出:
NullPointerException- 如果指定的map为空- 自从:
- 1.3
-
-
方法详情
-
size
public int size()返回此map中键值映射的数量。此结果是一个快照,可能不会反映未处理的条目,这些条目将在下次尝试访问之前被删除,因为它们不再被引用。 -
isEmpty
public boolean isEmpty()如果此map不包含键值映射,则返回true。此结果是一个快照,可能不会反映未处理的条目,这些条目将在下次尝试访问之前被删除,因为它们不再被引用。 -
get
返回指定键映射到的值,如果此map不包含键的映射,则返回null。更正式地说,如果此map包含从键
k到值v的映射,使得Objects.equals(key, k),则此方法返回v;否则返回null。 (最多可以有一个这样的映射。)null的返回值不一定指示映射不包含键的映射;map也可能将密钥显式映射到null。containsKey操作可用于区分这两种情况。 -
containsKey
如果此map包含指定键的映射,则返回true。- 指定者:
containsKey在接口Map<K,中V> - 重写:
containsKey在类AbstractMap<K,中V> - 参数:
key- 要测试其在此map中是否存在的密钥- 返回:
true如果有key的映射;false否则
-
put
将指定值与此map中的指定键相关联。如果map以前包含此键的映射,则旧值将被替换。 -
putAll
将指定map中的所有映射复制到此map。这些映射将替换此map对指定map中当前任何键的任何映射。- 指定者:
putAll在接口Map<K,中V> - 重写:
putAll在类AbstractMap<K,中V> - 参数:
m- 要存储在此map中的映射。- 抛出:
NullPointerException- 如果指定的map为空。
-
remove
如果存在,则从此弱hash map中删除键的映射。更正式地说,如果此map包含从键k到值v的映射,使得(key==null ? k==null : key.equals(k)),则该map将被删除。 (map最多可以包含一个这样的映射。)返回此map先前与键相关联的值,如果map不包含键的映射,则返回
null。null的返回值不一定指示映射不包含键的映射;map也可能将密钥显式映射到null。一旦调用返回,map将不包含指定键的映射。
-
clear
public void clear()从此map中删除所有映射。此调用返回后map将为空。 -
containsValue
如果此map将一个或多个键映射到指定值,则返回true。- 指定者:
containsValue在接口Map<K,中V> - 重写:
containsValue在类AbstractMap<K,中V> - 参数:
value- 要测试其在此map中是否存在的值- 返回:
true如果此map将一个或多个键映射到指定值
-
keySet
返回此map中包含的键的Set视图。该集合由map支持,因此对map的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改map(除了通过迭代器自己的remove操作),迭代的结果是不确定的。该集合支持元素删除,即通过Iterator.remove、Set.remove、removeAll、retainAll和clear操作从map中删除相应的映射。它不支持add或addAll操作。 -
values
返回此map中包含的值的Collection视图。集合由map支持,因此对map的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改map(除了通过迭代器自己的remove操作),迭代的结果是不确定的。该集合支持元素删除,即通过Iterator.remove、Collection.remove、removeAll、retainAll和clear操作从map中删除相应的映射。它不支持add或addAll操作。 -
entrySet
返回此map中包含的映射的Set视图。该集合由map支持,因此对map的更改会反映在集合中,反之亦然。如果在对集合进行迭代时映射被修改(除了通过迭代器自己的remove操作,或通过迭代器返回的映射条目上的setValue操作),迭代的结果是未定义的。该集合支持元素移除,即通过Iterator.remove、Set.remove、removeAll、retainAll和clear操作从map中移除相应的映射。它不支持add或addAll操作。 -
newWeakHashMap
创建一个适合预期映射数量的新的空 WeakHashMap。返回的map使用默认的加载因子 0.75,它的初始容量通常足够大,因此可以在不调整map大小的情况下添加预期数量的映射。- 类型参数:
K- 新map维护的键类型V- 映射值的类型- 参数:
numMappings- 预期的映射数- 返回:
- 新创建的map
- 抛出:
IllegalArgumentException- 如果 numMappings 为负- 自从:
- 19
-