K
- 由此地图维护的键的类型
V
- 映射值的类型
public class WeakHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>
支持null值和空值。 该类具有与HashMap类相似的性能特征 ,具有初始容量和负载因子的相同效率参数 。
像大多数集合类一样,此类不同步。 甲同步WeakHashMap可使用被构造Collections.synchronizedMap
方法。
这个类主要用于与主要对象,它们的equals方法测试使用==操作对象标识使用。 一旦这样的密钥被丢弃,它就永远不会被重新创建,所以不可能在稍后的一个WeakHashMap中查找该密钥,并且惊讶到它的条目被删除了。 这个类将非常适用于equals方法不基于对象标识的关键对象,例如String实例。 然而,对于这种可重用的关键对象,自动删除已被丢弃密钥的WeakHashMap条目可能会令人困惑。
WeakHashMap类的行为部分取决于垃圾收集器的操作,因此几个熟悉(但不是必需)的Map不变量不适用于此类。 因为垃圾收集器可能随时丢弃密钥,所以WeakHashMap可能表现为未知线程静默地删除条目。 特别是,即使您在WeakHashMap实例上进行同步 ,也没有调用其变异器方法, size方法可以随时间返回较小的值, isEmpty方法可以返回false然后返回true ,对于containsKey方法返回true及以后的false对于给定的键,对于get方法返回给定键的值,但后来返回null ,为put方法返回null和remove方法返回false以前似乎是在地图,以及密钥集的连续检查,值集合和条目集合,以产生相继较少数量的元素。
WeakHashMap中的每个关键对象间接存储为弱引用的对象。 因此,只有在地图的内部和外部的弱引用之后,密钥才会被垃圾收集器清除。
实现注意: WeakHashMap中的值对象由普通的强引用保存。 因此,应注意确保值对象不直接或间接强烈地引用其自己的键,因为这将阻止键被丢弃。 注意,值对象可以通过WeakHashMap本身间接地引用其键; 也就是说,值对象可能强烈地引用一些其他关键对象,其关联值对象又强烈地引用第一个值对象的键。 如果地图中的值不依赖于强调引用它们的地图,那么处理这种情况的一种方法是在插入之前将值本身包含在WeakReferences之前,如: m.put(key, new WeakReference(value)) ,然后在每个get上展开 。
由所有此类的“collection视图方法”返回的藏品iterator方法返回的迭代器是快速失败的 :如果地图随时结构上修改后的迭代器创建的,以任何方式,除了通过迭代器自己remove方法,迭代器会抛出一个ConcurrentModificationException
。 因此,面对并发修改,迭代器将快速而干净地失败,而不是在未来未确定的时间冒着任意的非确定性行为。
请注意,迭代器的故障快速行为无法保证,因为一般来说,在不同步并发修改的情况下,无法做出任何硬性保证。 失败快速迭代器尽力投入ConcurrentModificationException 。 因此,编写依赖于此异常的程序的正确性将是错误的:迭代器的故障快速行为应仅用于检测错误。
HashMap
, WeakReference
AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V>
Constructor and Description |
---|
WeakHashMap()
构造一个新的,空的
WeakHashMap ,默认的初始容量(16)和负载因子(0.75)。
|
WeakHashMap(int initialCapacity)
构造一个新的,空的
WeakHashMap ,具有给定的初始容量和默认负载因子(0.75)。
|
WeakHashMap(int initialCapacity, float loadFactor)
构造一个新的,空的
WeakHashMap与给定的初始容量和给定的负载因子。
|
WeakHashMap(Map<? extends K,? extends V> m)
构造一个新的
WeakHashMap与指定的地图相同的映射。
|
Modifier and Type | Method and Description |
---|---|
void |
clear()
从这张地图中删除所有的映射。
|
boolean |
containsKey(Object key)
如果此映射包含指定键的映射,则返回
true 。
|
boolean |
containsValue(Object value)
如果此地图将一个或多个键映射到指定的值,则返回
true 。
|
Set<Map.Entry<K,V>> |
entrySet()
返回此地图中包含的映射的 Set 视图。
|
void |
forEach(BiConsumer<? super K,? super V> action)
对此映射中的每个条目执行给定的操作,直到所有条目都被处理或操作引发异常。
|
V |
get(Object key)
返回到指定键所映射的值,或
null 如果此映射包含该键的映射。
|
boolean |
isEmpty()
如果此地图不包含键值映射,则返回
true 。
|
Set<K> |
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()
返回此地图中键值映射的数量。
|
Collection<V> |
values()
返回此地图中包含的值的 Collection 视图。
|
clone, equals, hashCode, toString
finalize, getClass, notify, notifyAll, wait, wait, wait
compute, computeIfAbsent, computeIfPresent, equals, getOrDefault, hashCode, merge, putIfAbsent, remove, replace, replace
public WeakHashMap(int initialCapacity, float loadFactor)
initialCapacity
- 初始容量为
WeakHashMap
loadFactor
- 负载因子
WeakHashMap
IllegalArgumentException
- 如果初始容量为负值,或负载因子为非正值。
public WeakHashMap(int initialCapacity)
initialCapacity
- 初始容量为
WeakHashMap
IllegalArgumentException
- 如果初始容量为负
public WeakHashMap()
public WeakHashMap(Map<? extends K,? extends V> m)
m
- 其映射将放置在此映射中的映射
NullPointerException
- 如果指定的地图为空
public int size()
public boolean isEmpty()
public V get(Object key)
null
如果此映射包含该键的映射。
更正式地,如果该地图包含从一个键k
到v
,使得(key==null ? k==null : key.equals(k))
,则该方法返回v
; 否则返回null
。 (最多可以有一个这样的映射。)
返回值为null
并不一定表明该映射不包含该键的映射关系; 地图也可能明确地将密钥映射到null
。 containsKey
操作可用于区分这两种情况。
get
在界面
Map<K,V>
get
在类别
AbstractMap<K,V>
key
- 要返回其关联值的键
null
put(Object, Object)
public boolean containsKey(Object key)
containsKey
在界面
Map<K,V>
containsKey
在
AbstractMap<K,V>
key
- 要在此地图中存在的密钥要进行测试
public void putAll(Map<? extends K,? extends V> m)
putAll
在界面
Map<K,V>
putAll
在
AbstractMap<K,V>
m
- 要存储在此地图中的映射。
NullPointerException
- 如果指定的地图为空。
public V remove(Object key)
(key==null ? k==null : key.equals(k))
,该映射被去除。
(地图最多可以包含一个这样的映射。)
返回此地图先前相关联的密钥,或null如果映射包含该键的映射值。 返回值null并不一定表示该映射不包含该键的映射; 地图也可能将密钥显式映射到null 。
一旦呼叫返回,该映射将不包含指定键的映射。
public void clear()
public boolean containsValue(Object value)
containsValue
在界面
Map<K,V>
containsValue
在
AbstractMap<K,V>
value
- 要在此地图中存在的值要进行测试
public Set<K> keySet()
Set
视图。
该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。
如果在集合中的迭代正在进行中修改映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。
该组支持元件移除,即从映射中相应的映射,经由Iterator.remove,Set.remove,removeAll,retainAll和clear操作。
它不支持add或addAll操作。
public Collection<V> values()
Collection
视图。
集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。
如果在集合中的迭代正在进行中修改映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。
该collection支持元素移除,即从映射中相应的映射,经由Iterator.remove,Collection.remove,removeAll,retainAll和clear操作。
它不支持add或addAll操作。
public Set<Map.Entry<K,V>> entrySet()
Set
视图。
该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。
如果在集合中的迭代正在进行时修改映射(除了通过迭代器自己的remove操作,或者通过迭代器返回的映射条目上的setValue操作),迭代的结果是未定义的。
该组支持元件移除,即从映射中相应的映射,经由Iterator.remove,Set.remove,removeAll,retainAll和clear操作。
它不支持add或addAll操作。
public void forEach(BiConsumer<? super K,? super V> action)
Map
复制
public void replaceAll(BiFunction<? super K,? super V,? extends V> function)
Map
复制
replaceAll
在界面
Map<K,V>
function
- 应用于每个条目的功能