- java.lang.Object
-
- java.util.AbstractMap<K,V>
-
- java.util.WeakHashMap<K,V>
-
- 参数类型
-
K
- 此映射维护的密钥类型 -
V
- 映射值的类型
- 实现的所有接口
-
Map<K,V>
public class WeakHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>
基于哈希表的Map
接口的实现,具有弱键 。WeakHashMap
的条目在其密钥不再正常使用时将自动删除。 更确切地说,给定密钥的映射的存在不会阻止密钥被垃圾收集器丢弃,即,可以最终化,最终化,然后回收。 当一个键被丢弃时,它的条目将被有效地从地图中删除,因此该类的行为与其他Map
实现略有不同。支持空值和空值。 该类具有与
HashMap
类相似的性能特征,并具有与初始容量和负载因子相同的效率参数。与大多数集合类一样,此类不同步。 甲同步
WeakHashMap
可使用被构造Collections.synchronizedMap
方法。此类主要用于
equals
方法使用==
运算符测试对象标识的关键对象。 一旦这样的密钥被丢弃,它就永远不会被重新创建,因此以后不可能在WeakHashMap
中查找该密钥,并且对其条目已被删除感到惊讶。 此类可以很好地与equals
方法不基于对象标识的关键对象equals
使用,例如String
实例。 但是,对于这种可重新调用的密钥对象,自动删除其密钥被丢弃的WeakHashMap
条目可能会令人困惑。WeakHashMap
类的行为部分取决于垃圾收集器的操作,因此几个熟悉的(但不是必需的)Map
不变量不适用于此类。 由于垃圾收集器可能随时丢弃密钥,因此WeakHashMap
可能表现为未知线程正在静默删除条目。 特别是,即使您在WeakHashMap
实例上同步并且不调用其任何mutator方法,size
方法也可能随时间返回较小的值,因为isEmpty
方法返回false
然后返回true
,因为containsKey
方法返回true
和更高版本false
对于给定的密钥,对于get
方法返回给定密钥的值但稍后返回null
,对于put
方法返回null
和remove
方法返回false
以获取之前false
在映射,以及对密钥集,值集合和条目集的连续检查,以连续产生较少数量的元素。WeakHashMap
每个关键对象间接存储为弱引用的引用对象。 因此,只有在垃圾收集器清除了对映射内部和外部的弱引用之后,才会自动删除密钥。实现说明:
WeakHashMap
中的值对象由普通的强引用保存。 因此,应该注意确保值对象不直接或间接地强烈引用它们自己的密钥,因为这将防止密钥被丢弃。 请注意,值对象可以通过WeakHashMap
本身间接引用其键; 也就是说,值对象可以强烈地引用一些其他关键对象,其关联的值对象又强烈地引用第一值对象的关键字。 如果地图中的值不依赖于持有对它们的强引用的映射,则处理此问题的一种方法是在插入之前将值本身包装在WeakReferences
,如:m.put(key, new WeakReference(value))
,然后展开每个get
。由所有类的“集合视图方法”返回的集合的
iterator
方法返回的迭代器是快速失败的 :如果在创建迭代器之后的任何时候对映射进行结构修改,除了通过迭代器自己的remove
方法,迭代器将抛出ConcurrentModificationException
。 因此,在并发修改的情况下,迭代器快速而干净地失败,而不是在未来的未确定时间冒任意,非确定性行为的风险。请注意,迭代器的快速失败行为无法得到保证,因为一般来说,在存在不同步的并发修改时,不可能做出任何硬性保证。 失败快速迭代器以尽力而为的方式抛出
ConcurrentModificationException
。 因此,编写依赖于此异常的程序以确保其正确性是错误的: 迭代器的快速失败行为应该仅用于检测错误。此类是Java Collections Framework的成员。
- 从以下版本开始:
- 1.2
- 另请参见:
-
HashMap
,WeakReference
-
-
嵌套类汇总
-
嵌套类/接口声明在类 java.util.AbstractMap
AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V>
-
-
构造方法摘要
构造方法 构造器 描述 WeakHashMap()
使用默认初始容量(16)和加载因子(0.75)构造一个新的空WeakHashMap
。WeakHashMap(int initialCapacity)
使用给定的初始容量和默认加载因子(0.75)构造一个新的空WeakHashMap
。WeakHashMap(int initialCapacity, float loadFactor)
使用给定的初始容量和给定的加载因子构造一个新的空WeakHashMap
。WeakHashMap(Map<? extends K,? extends V> m)
构造一个新的WeakHashMap
,其映射与指定的映射相同。
-
方法摘要
所有方法 实例方法 具体的方法 变量和类型 方法 描述 void
clear()
从此映射中删除所有映射。boolean
containsKey(Object key)
如果此映射包含指定键的映射,则返回true
。boolean
containsValue(Object value)
如果此映射将一个或多个键映射到指定值,则返回true
。Set<Map.Entry<K,V>>
entrySet()
返回此映射中包含的映射的Set
视图。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)
如果存在,则从此弱哈希映射中移除键的映射。int
size()
返回此映射中键 - 值映射的数量。Collection<V>
values()
返回此映射中包含的值的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
。- 参数
-
initialCapacity
-所述的初始容量WeakHashMap
-
loadFactor
-在所述的负载因数WeakHashMap
- 异常
-
IllegalArgumentException
- 如果初始容量为负数,或者负载因子为非正数。
-
WeakHashMap
public WeakHashMap(int initialCapacity)
使用给定的初始容量和默认加载因子(0.75)构造一个新的空WeakHashMap
。- 参数
-
initialCapacity
-所述的初始容量WeakHashMap
- 异常
-
IllegalArgumentException
- 如果初始容量为负数
-
WeakHashMap
public WeakHashMap()
使用默认初始容量(16)和加载因子(0.75)构造一个新的空WeakHashMap
。
-
WeakHashMap
public WeakHashMap(Map<? extends K,? extends V> m)
构造一个新的WeakHashMap
,其映射与指定的映射相同。WeakHashMap
使用默认加载因子(0.75)创建,初始容量足以保存指定映射中的映射。- 参数
-
m
-m
映射放置在此映射中的映射 - 异常
-
NullPointerException
- 如果指定的映射为null - 从以下版本开始:
- 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
- 如果指定的映射为null。
-
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
操作。
-
-