- 类型参数:
-
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
ConstructorDescription使用默认初始容量(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 TypeMethodDescriptionvoid
clear()
从此地图中删除所有映射。boolean
containsKey
(Object key) 如果此地图包含指定键的映射,则返回true
。boolean
containsValue
(Object value) 如果此地图将一个或多个键映射到指定值,则返回true
。entrySet()
返回此地图中包含的映射的Set
视图。返回指定键映射到的值,如果此地图不包含键的映射,则返回null
。boolean
isEmpty()
如果此地图不包含键-值映射,则返回true
。keySet()
返回此地图中包含的键的Set
视图。static <K,
V> WeakHashMap <K, V> newWeakHashMap
(int numMappings) 创建一个适用于预期映射数量的新的空WeakHashMap。在此地图中将指定键与指定值关联。void
从指定地图复制所有映射到此地图。如果存在,则从此弱哈希映射中删除键的映射。int
size()
返回此地图中键-值映射的数量。values()
返回此地图中包含的值的Collection
视图。Methods declared in class java.util.AbstractMap
clone, equals, hashCode, toString
Methods 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
-