Module java.base
Package java.util

Class WeakHashMap<K,V>

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中的条目将在其键不再被普通使用时自动删除。更准确地说,对于给定键的映射的存在不会阻止垃圾回收器丢弃该键,即,使其变为finalizable,finalized,然后被回收。当键已被丢弃时,其条目将从地图中有效地删除,因此此类的行为与其他Map实现有所不同。

支持空值和空键。此类的性能特征类似于HashMap类,并具有相同的效率参数初始容量负载因子

与大多数集合类一样,此类不是同步的。可以使用Collections.synchronizedMap方法构造同步的WeakHashMap

此类主要用于具有equals方法使用==运算符测试对象标识的键对象。一旦这样的键被丢弃,就无法重新创建它,因此不可能在以后的某个时间在WeakHashMap中查找该键并惊讶地发现其条目已被删除。对于不基于对象标识的equals方法的键对象,例如String实例,此类将完美地工作。但是,对于具有可重新创建的键对象,已丢弃其键的WeakHashMap条目的自动删除可能会导致混淆。

WeakHashMap类的行为部分取决于垃圾回收器的操作,因此对于此类,一些熟悉的(尽管不是必需的)Map不变性不适用。由于垃圾回收器可能随时丢弃键,因此WeakHashMap可能表现为未知线程悄悄删除条目。特别是,即使在WeakHashMap实例上同步并调用其任何mutator方法,size方法随时间返回较小的值,isEmpty方法返回false然后返回truecontainsKey方法返回true,然后对于给定键返回falseget方法返回给定键的值,但稍后返回nullput方法返回nullremove方法返回false,以前似乎在地图中的键,以及对键集,值集和条目集的连续检查,将产生逐渐减少的元素数量。

WeakHashMap中的每个键对象都间接存储为弱引用的引用对象。因此,只有在垃圾回收器清除了对其的弱引用时,键才会自动删除,无论是在地图内部还是外部。

实现注意: WeakHashMap中的值对象由普通强引用持有。因此,应注意确保值对象不直接或间接地强引用其自己的键,因为这将阻止键被丢弃。请注意,值对象可以通过WeakHashMap本身间接引用其键;也就是说,值对象可以强引用另一个键对象,而关联的值对象反过来又强引用第一个值对象的键。如果地图中的值不依赖于地图持有对它们的强引用,处理此问题的一种方法是在插入之前将值本身包装在WeakReferences中,如:m.put(key, new WeakReference(value)),然后在每次get时取消包装。

由此类的所有“集合视图方法”返回的集合的iterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时间内以任何方式对地图进行结构修改,除了通过迭代器自己的remove方法,迭代器将抛出ConcurrentModificationException。因此,在面对并发修改时,迭代器会快速而干净地失败,而不是在未来的不确定时间冒险任意的非确定性行为。

请注意,迭代器的快速失败行为无法保证,因为一般来说,在未同步的并发修改的情况下,不可能做出任何硬性保证。快速失败迭代器尽力而为地在最佳努力基础上抛出ConcurrentModificationException。因此,编写依赖此异常正确性的程序是错误的:迭代器的快速失败行为应仅用于检测错误。

此类是Java集合框架的成员。

自 JDK 版本:
1.2
参见:
  • 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

      public WeakHashMap(Map<? extends K,? extends V> m)
      使用与指定地图相同映射的新WeakHashMapWeakHashMap是使用默认负载因子(0.75)和足以容纳指定地图中映射的初始容量创建的。
      参数:
      m - 要将其映射放入此地图中的地图
      抛出:
      NullPointerException - 如果指定的地图为null
      自 JDK 版本:
      1.3
  • Method Details

    • size

      public int size()
      返回此地图中键-值映射的数量。此结果是一个快照,可能不反映在下一次尝试访问之前将被删除的未处理条目。
      指定者:
      size 在接口 Map<K,V>
      覆盖:
      size 在类 AbstractMap<K,V>
      返回:
      此地图中键-值映射的数量
    • isEmpty

      public boolean isEmpty()
      如果此地图不包含键-值映射,则返回true。此结果是一个快照,可能不反映在下一次尝试访问之前将被删除的未处理条目。
      指定由:
      isEmpty 在接口 Map<K,V>
      覆盖:
      isEmpty 在类 AbstractMap<K,V>
      返回:
      如果此映射不包含键-值映射,则返回true
    • get

      public V get(Object key)
      返回指定键映射到的值,如果此映射不包含键的映射,则返回null

      更正式地说,如果此映射包含从键k到值v的映射,使得Objects.equals(key, k),则此方法返回v;否则返回null。(最多只能有一个这样的映射。)

      返回null的值并不一定表示映射不包含键的映射;也有可能映射将键明确映射到null。可以使用containsKey操作来区分这两种情况。

      指定由:
      get 在接口 Map<K,V>
      覆盖:
      get 在类 AbstractMap<K,V>
      参数:
      key - 要返回其关联值的键
      返回:
      指定键映射到的值,如果此映射不包含键的映射,则返回null
      参见:
    • containsKey

      public boolean containsKey(Object key)
      如果此映射包含指定键的映射,则返回true
      指定由:
      containsKey 在接口 Map<K,V>
      覆盖:
      containsKey 在类 AbstractMap<K,V>
      参数:
      key - 要测试其在此映射中是否存在的键
      返回:
      如果存在key的映射,则返回true;否则返回false
    • put

      public V put(K key, V value)
      在此映射中将指定的值与指定的键关联。如果映射先前包含此键的映射,则替换旧值。
      指定由:
      put 在接口 Map<K,V>
      覆盖:
      put 在类 AbstractMap<K,V>
      参数:
      key - 要关联指定值的键
      value - 要与指定键关联的值
      返回:
      key关联的先前值,如果key之前没有映射,则返回null。(null的返回值也可能表示映射先前将keynull关联。)
    • putAll

      public void putAll(Map<? extends K,? extends V> m)
      将指定映射中的所有映射复制到此映射中。这些映射将替换此映射当前对于指定映射中当前任何键的任何映射。
      指定由:
      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

      一旦调用返回,映射将不包含指定键的映射。

      指定由:
      remove 在接口 Map<K,V>
      覆盖:
      remove 在类 AbstractMap<K,V>
      参数:
      key - 要从映射中删除其映射的键
      返回:
      key关联的先前值,如果key没有映射,则返回null
    • clear

      public void clear()
      从此映射中删除所有映射。此调用返回后,映射将为空。
      指定由:
      clear 在接口 Map<K,V>
      覆盖:
      clear 在类 AbstractMap<K,V>
    • containsValue

      public boolean containsValue(Object value)
      如果此映射将一个或多个键映射到指定值,则返回true
      指定由:
      containsValue 在接口 Map<K,V>
      覆盖:
      containsValue 在类 AbstractMap<K,V>
      参数:
      value - 要测试其在此映射中是否存在的值
      返回:
      如果此映射将一个或多个键映射到指定值,则返回true
    • keySet

      public Set<K> keySet()
      返回此映射中包含的键的Set视图。该集合由映射支持,因此对映射的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(除了通过迭代器自身的remove操作),则迭代的结果是未定义的。该集合支持元素删除,通过Iterator.removeSet.removeremoveAllretainAllclear操作从映射中删除相应的映射。它不支持addaddAll操作。
      指定由:
      keySet 在接口 Map<K,V>
      覆盖:
      keySet 在类 AbstractMap<K,V>
      返回:
      包含在此映射中的键的集合视图
    • values

      public Collection<V> values()
      返回此映射中包含的值的Collection视图。该集合由映射支持,因此对映射的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(除非通过迭代器自己的remove操作),则迭代的结果是未定义的。该集合支持元素删除,可以通过Iterator.removeCollection.removeremoveAllretainAllclear操作从映射中删除相应的映射。它不支持addaddAll操作。
      指定者:
      values 在接口 Map<K,V>
      覆盖:
      values 在类 AbstractMap<K,V>
      返回:
      包含在此映射中的值的集合视图
    • entrySet

      public Set<Map.Entry<K,V>> entrySet()
      返回此映射中包含的映射的Set视图。该集合由映射支持,因此对映射的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(除非通过迭代器自己的remove操作,或通过迭代器返回的映射条目上的setValue操作),则迭代的结果是未定义的。该集合支持元素删除,可以通过Iterator.removeSet.removeremoveAllretainAllclear操作从映射中删除相应的映射。它不支持addaddAll操作。
      指定者:
      entrySet 在接口 Map<K,V>
      返回:
      包含在此映射中的映射的集合视图
    • newWeakHashMap

      public static <K, V> WeakHashMap<K,V> newWeakHashMap(int numMappings)
      创建一个新的、空的WeakHashMap,适用于预期的映射数量。返回的映射使用默认的负载因子0.75,并且其初始容量通常足够大,以便可以添加预期数量的映射而无需调整映射的大小。
      类型参数:
      K - 新映射维护的键的类型
      V - 映射值的类型
      参数:
      numMappings - 预期的映射数量
      返回:
      新创建的映射
      抛出:
      IllegalArgumentException - 如果numMappings为负数
      自:
      19