- 类型参数:
-
K- 此映射维护的键的类型 -
V- 映射值的类型
- 所有实现的接口:
-
Map<K,V>
Map接口实现,具有弱键。在WeakHashMap中的条目将在其键不再被普通使用时自动删除。更准确地说,对于给定键的映射的存在不会阻止垃圾回收器丢弃该键,即,使其变为finalizable,finalized,然后被回收。当键已被丢弃时,其条目将从地图中有效地删除,因此此类的行为与其他Map实现有所不同。
支持空值和空键。此类的性能特征类似于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)),然后在每次get时取消包装。
由此类的所有“集合视图方法”返回的集合的iterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时间内以任何方式对地图进行结构修改,除了通过迭代器自己的remove方法,迭代器将抛出ConcurrentModificationException。因此,在面对并发修改时,迭代器会快速而干净地失败,而不是在未来的不确定时间冒险任意的非确定性行为。
请注意,迭代器的快速失败行为无法保证,因为一般来说,在未同步的并发修改的情况下,不可能做出任何硬性保证。快速失败迭代器尽力而为地在最佳努力基础上抛出ConcurrentModificationException。因此,编写依赖此异常正确性的程序是错误的:迭代器的快速失败行为应仅用于检测错误。
此类是Java集合框架的成员。
- 自 JDK 版本:
- 1.2
- 参见:
-
Nested Class Summary
Nested classes/interfaces declared in class java.util.AbstractMap
AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K, V> -
Constructor Summary
ConstructorsConstructorDescription使用默认初始容量(16)和负载因子(0.75)构造一个新的空WeakHashMap。WeakHashMap(int initialCapacity) 使用给定的初始容量和默认负载因子(0.75)构造一个新的空WeakHashMap。WeakHashMap(int initialCapacity, float loadFactor) 使用给定的初始容量和给定的负载因子构造一个新的空WeakHashMap。WeakHashMap(Map<? extends K, ? extends V> m) 构造具有与指定地图相同映射的新WeakHashMap。 -
Method Summary
Modifier and TypeMethodDescriptionvoidclear()从此地图中删除所有映射。booleancontainsKey(Object key) 如果此地图包含指定键的映射,则返回true。booleancontainsValue(Object value) 如果此地图将一个或多个键映射到指定值,则返回true。entrySet()返回此地图中包含的映射的Set视图。返回指定键映射到的值,如果此地图不包含键的映射,则返回null。booleanisEmpty()如果此地图不包含键-值映射,则返回true。keySet()返回此地图中包含的键的Set视图。static <K,V> WeakHashMap <K, V> newWeakHashMap(int numMappings) 创建一个适用于预期映射数量的新的空WeakHashMap。在此地图中将指定键与指定值关联。void从指定地图复制所有映射到此地图。如果存在,则从此弱哈希映射中删除键的映射。intsize()返回此地图中键-值映射的数量。values()返回此地图中包含的值的Collection视图。Methods declared in class java.util.AbstractMap
clone, equals, hashCode, toStringMethods declared in interface java.util.Map
compute, computeIfAbsent, computeIfPresent, equals, forEach, getOrDefault, hashCode, merge, putIfAbsent, remove, replace, replace, replaceAll
-
Constructor Details
-
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
使用与指定地图相同映射的新WeakHashMap。WeakHashMap是使用默认负载因子(0.75)和足以容纳指定地图中映射的初始容量创建的。- 参数:
-
m- 要将其映射放入此地图中的地图 - 抛出:
-
NullPointerException- 如果指定的地图为null - 自 JDK 版本:
- 1.3
-
-
Method Details
-
size
public int size()返回此地图中键-值映射的数量。此结果是一个快照,可能不反映在下一次尝试访问之前将被删除的未处理条目。 -
isEmpty
public boolean isEmpty()如果此地图不包含键-值映射,则返回true。此结果是一个快照,可能不反映在下一次尝试访问之前将被删除的未处理条目。 -
get
返回指定键映射到的值,如果此映射不包含键的映射,则返回null。更正式地说,如果此映射包含从键
k到值v的映射,使得Objects.equals(key, k),则此方法返回v;否则返回null。(最多只能有一个这样的映射。)返回
null的值并不一定表示映射不包含键的映射;也有可能映射将键明确映射到null。可以使用containsKey操作来区分这两种情况。 -
containsKey
如果此映射包含指定键的映射,则返回true。- 指定由:
-
containsKey在接口Map<K,中V> - 覆盖:
-
containsKey在类AbstractMap<K,中V> - 参数:
-
key- 要测试其在此映射中是否存在的键 - 返回:
-
如果存在
key的映射,则返回true;否则返回false
-
put
在此映射中将指定的值与指定的键关联。如果映射先前包含此键的映射,则替换旧值。 -
putAll
将指定映射中的所有映射复制到此映射中。这些映射将替换此映射当前对于指定映射中当前任何键的任何映射。- 指定由:
-
putAll在接口Map<K,中V> - 覆盖:
-
putAll在类AbstractMap<K,中V> - 参数:
-
m- 要存储在此映射中的映射 - 抛出:
-
NullPointerException- 如果指定的映射为null
-
remove
如果存在,则从此弱哈希映射中删除键的映射。更正式地说,如果此映射包含从键k到值v的映射,使得(key==null ? k==null : key.equals(k)),则将删除该映射。(映射最多只能包含一个这样的映射。)返回此映射先前关联的键,如果映射不包含键的映射,则返回
null。返回null的值并不一定表示映射不包含键的映射;也有可能映射将键明确映射到null。一旦调用返回,映射将不包含指定键的映射。
-
clear
public void clear()从此映射中删除所有映射。此调用返回后,映射将为空。 -
containsValue
如果此映射将一个或多个键映射到指定值,则返回true。- 指定由:
-
containsValue在接口Map<K,中V> - 覆盖:
-
containsValue在类AbstractMap<K,中V> - 参数:
-
value- 要测试其在此映射中是否存在的值 - 返回:
-
如果此映射将一个或多个键映射到指定值,则返回
true
-
keySet
返回此映射中包含的键的Set视图。该集合由映射支持,因此对映射的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(除了通过迭代器自身的remove操作),则迭代的结果是未定义的。该集合支持元素删除,通过Iterator.remove、Set.remove、removeAll、retainAll和clear操作从映射中删除相应的映射。它不支持add或addAll操作。 -
values
返回此映射中包含的值的Collection视图。该集合由映射支持,因此对映射的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(除非通过迭代器自己的remove操作),则迭代的结果是未定义的。该集合支持元素删除,可以通过Iterator.remove、Collection.remove、removeAll、retainAll和clear操作从映射中删除相应的映射。它不支持add或addAll操作。 -
entrySet
返回此映射中包含的映射的Set视图。该集合由映射支持,因此对映射的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(除非通过迭代器自己的remove操作,或通过迭代器返回的映射条目上的setValue操作),则迭代的结果是未定义的。该集合支持元素删除,可以通过Iterator.remove、Set.remove、removeAll、retainAll和clear操作从映射中删除相应的映射。它不支持add或addAll操作。 -
newWeakHashMap
创建一个新的、空的WeakHashMap,适用于预期的映射数量。返回的映射使用默认的负载因子0.75,并且其初始容量通常足够大,以便可以添加预期数量的映射而无需调整映射的大小。- 类型参数:
-
K- 新映射维护的键的类型 -
V- 映射值的类型 - 参数:
-
numMappings- 预期的映射数量 - 返回:
- 新创建的映射
- 抛出:
-
IllegalArgumentException- 如果numMappings为负数 - 自:
- 19
-