- java.lang.Object
-
- java.util.AbstractMap<K,V>
-
- java.util.WeakHashMap<K,V>
-
- 参数类型
-
K
- 由该地图维护的键的类型 -
V
- 映射值的类型
- All Implemented Interfaces:
-
Map<K,V>
public class WeakHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>
基于哈希表的实现的Map
接口,具有弱键 。WeakHashMap
的条目在其键不再被普通使用时将自动删除。 更准确地说,给定密钥的映射的存在将不会阻止该密钥被垃圾收集器丢弃,也就是可以最终确定,最终确定,然后被回收。 当一个密钥被丢弃时,它的条目被有效地从地图上移除,所以这个类的行为与其他Map
实现有些不同。支持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
展开。由所有这个类的“集合视图方法”返回的集合的
iterator
方法返回的迭代器是故障快速的 :如果映射在迭代器创建之后的任何时间被结构地修改,除了通过迭代器自己的remove
方法,迭代器会抛出一个ConcurrentModificationException
。 因此,面对并发修改,迭代器将快速而干净地失败,而不是在未来未确定的时间冒着任意的非确定性行为。请注意,迭代器的故障快速行为无法保证,因为一般来说,在不同步并发修改的情况下,无法做出任何硬性保证。 失败快速迭代器
ConcurrentModificationException
扔掉ConcurrentModificationException
。 因此,编写依赖于此异常的程序的正确性将是错误的: 迭代器的故障快速行为应仅用于检测错误。这个类是Java Collections Framework的成员。
- 从以下版本开始:
- 1.2
- 另请参见:
-
HashMap
,WeakReference
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class java.util.AbstractMap
AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V>
-
-
构造方法摘要
构造方法 Constructor 描述 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 方法 描述 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
视图。-
Methods inherited from class java.util.AbstractMap
clone, equals, hashCode, toString
-
-
-
-
构造方法详细信息
-
WeakHashMap
public WeakHashMap(int initialCapacity, float loadFactor)
构造一个新的,空的WeakHashMap
具有给定的初始容量和给定的负载因子。- 参数
-
initialCapacity
- 初始容量为WeakHashMap
-
loadFactor
-在所述的负载因数WeakHashMap
- 异常
-
IllegalArgumentException
- 如果初始容量为负值,或负载因子为非正值。
-
WeakHashMap
public WeakHashMap(int initialCapacity)
构造一个新的,空的WeakHashMap
具有给定的初始容量和默认负载因子(0.75)。- 参数
-
initialCapacity
- 初始容量为WeakHashMap
- 异常
-
IllegalArgumentException
- 如果初始容量为负
-
WeakHashMap
public WeakHashMap()
构造一个新的,空的WeakHashMap
,默认的初始容量(16)和负载因子(0.75)。
-
WeakHashMap
public WeakHashMap(Map<? extends K,? extends V> m)
构造新的WeakHashMap
与指定的映射相同的映射。WeakHashMap
创建具有默认负载因子(0.75),初始容量足以容纳指定映射中的映射。- 参数
-
m
- 其映射将放置在此映射中的映射 - 异常
-
NullPointerException
- 如果指定的地图为空 - 从以下版本开始:
- 1.3
-
-
方法详细信息
-
size
public int size()
返回此地图中键值映射的数量。 此结果是一个快照,并且可能不反映在下次尝试访问之前将被删除的未处理条目,因为它们不再被引用。
-
isEmpty
public boolean isEmpty()
如果此映射不包含键值映射,则返回true
。 此结果是一个快照,并且可能不反映在下次尝试访问之前将被删除的未处理条目,因为它们不再被引用。
-
get
public V get(Object key)
返回指定键映射到的值,如果此映射不包含键的映射,则返回null
。更正式地,如果此映射包含从密钥映射
k
到值v
使得Objects.equals(key, k)
,则此方法返回v
; 否则返回null
。 (最多可以有一个这样的映射。)返回值为
null
并不一定表示该映射不包含该键的映射; 地图也可能显式地将密钥映射到null
。 可以使用containsKey
操作来区分这两种情况。- Specified by:
-
get
在接口Map<K,V>
- 重写:
-
get
在AbstractMap<K,V>
- 参数
-
key
- 要返回其关联值的键 - 结果
-
指定键映射到的值,如果此映射不包含键的映射,
null
- 另请参见:
-
put(Object, Object)
-
containsKey
public boolean containsKey(Object key)
如果此映射包含指定键的映射,则返回true
。- Specified by:
-
containsKey
在接口Map<K,V>
- 重写:
-
containsKey
在AbstractMap<K,V>
- 参数
-
key
- 要在此地图中存在的密钥要进行测试 - 结果
-
true
如果有一个key
的映射; 否则为false
-
putAll
public void putAll(Map<? extends K,? extends V> m)
将指定地图的所有映射复制到此地图。 这些映射将替换此映射对当前在指定映射中的任何键的任何映射。- Specified by:
-
putAll
在接口Map<K,V>
- 重写:
-
putAll
在AbstractMap<K,V>
- 参数
-
m
- 要存储在此地图中的映射。 - 异常
-
NullPointerException
- 如果指定的地图为空。
-
remove
public V remove(Object key)
如果存在,则从该弱散列映射中删除密钥的映射。 更正式地,如果该映射包含从键k
到值v
的映射,使得(key==null ? k==null : key.equals(k))
,则删除该映射。 (地图最多可以包含一个这样的映射。)返回此映射先前关联的关键字的值,如果映射不包含关键字的映射,则返回
null
。 返回值为null
并不一定表示该映射不包含该键的映射; 地图也可能将密钥明确映射到null
。一旦呼叫返回,该映射将不包含指定键的映射。
-
clear
public void clear()
从这张地图中删除所有的映射。 此呼叫返回后,地图将为空。
-
containsValue
public boolean containsValue(Object value)
如果此映射将一个或多个键映射到指定的值,则返回true
。- Specified by:
-
containsValue
在接口Map<K,V>
- 重写:
-
containsValue
在AbstractMap<K,V>
- 参数
-
value
- 要在该地图中存在的值要进行测试 - 结果
-
true
如果该地图将一个或多个键映射到指定的值
-
keySet
public Set<K> keySet()
返回此地图中包含的键的Set
视图。 该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。 如果在集合中的迭代正在进行中修改映射(除了通过迭代器自己的remove
操作),迭代的结果是未定义的。 该组支持元件移除,即从映射中相应的映射,经由Iterator.remove
,Set.remove
,removeAll
,retainAll
,和clear
操作。 它不支持add
或addAll
操作。
-
values
public Collection<V> values()
返回此地图中包含的值的Collection
视图。 集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。 如果在集合中的迭代正在进行中修改映射(除了通过迭代器自己的remove
操作),迭代的结果是未定义的。 该collection支持元素移除,即从映射中相应的映射,经由Iterator.remove
,Collection.remove
,removeAll
,retainAll
和clear
操作。 它不支持add
或addAll
操作。
-
entrySet
public Set<Map.Entry<K,V>> entrySet()
返回此地图中包含的映射的Set
视图。 该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。 如果在集合中的迭代正在进行中修改映射(除了通过迭代器自己的remove
操作,或者通过迭代器返回的映射条目上的setValue
操作),迭代的结果是未定义的。 该组支持元件移除,即从映射中相应的映射,经由Iterator.remove
,Set.remove
,removeAll
,retainAll
和clear
操作。 它不支持add
或addAll
操作。
-
forEach
public void forEach(BiConsumer<? super K,? super V> action)
说明从界面Map
复制对此映射中的每个条目执行给定的操作,直到所有条目都被处理或操作引发异常。 除非实现类另有指定,否则按照进入设置迭代的顺序执行操作(如果指定了迭代顺序)。操作引发的异常被转发给调用者。
-
replaceAll
public void replaceAll(BiFunction<? super K,? super V,? extends V> function)
说明从接口Map
复制将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理或该函数抛出异常。 函数抛出的异常被转发给调用方。- Specified by:
-
replaceAll
在接口Map<K,V>
- 参数
-
function
- 应用于每个条目的功能
-
-