模块 java.base
 java.util

类 WeakHashMap<K,V>

java.lang.Object
java.util.AbstractMap <K,V>
java.util.WeakHashMap<K,V>
类型参数:
K - 此map维护的键类型
V - 映射值的类型
所有已实现的接口:
Map<K,V>

public class WeakHashMap<K,V> extends AbstractMap <K,V> implements Map <K,V>
Map 接口的基于哈希表的实现,带有 weak keysWeakHashMap 中的条目在其密钥不再正常使用时将自动删除。更准确地说,给定键的映射的存在不会阻止该键被垃圾收集器丢弃,即使其可终结、终结,然后回收。当一个键被丢弃时,它的条目实际上从map中删除,所以这个类的行为与其他 Map 实现有些不同。

支持空值和空键。此类具有与 HashMap 类相似的性能特征,并具有与 initial capacityload factor 相同的效率参数。

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

此类主要用于其 equals 方法使用 == 运算符测试对象身份的关键对象。一旦这样的密钥被丢弃,它就永远无法重新创建,因此以后不可能在 WeakHashMap 中查找该密钥并惊讶于它的条目已被删除。此类将与 equals 方法不基于对象身份的关键对象完美配合,例如 String 实例。然而,对于此类可重新创建的密钥对象,自动删除其密钥已被丢弃的 WeakHashMap 条目可能会令人困惑。

WeakHashMap 类的行为部分取决于垃圾收集器的操作,因此几个熟悉的(虽然不是必需的)Map 不变量不适用于此类。因为垃圾收集器可能随时丢弃键,WeakHashMap 可能表现得好像未知线程正在静默删除条目。特别是,即使您在 WeakHashMap 实例上同步并且不调用它的任何增变器方法,随着时间的推移,size 方法也可能返回较小的值,isEmpty 方法返回 false,然后返回 truecontainsKey 方法返回true 和后来的 false 对于给定的键,对于 get 方法返回给定键的值但稍后返回 null ,对于 put 方法返回 nullremove 方法返回 false 对于以前出现在映射,以及对键集、值集合和条目集的连续检查,以产生连续较少数量的元素。

WeakHashMap 中的每个键对象都间接存储为弱引用的引用对象。因此,只有在map内部和外部对其的弱引用已被垃圾收集器清除后,才会自动删除该键。

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

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

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

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

自从:
1.2
参见:
  • 构造方法详细信息

    • 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)
      使用与指定map相同的映射构造一个新的 WeakHashMapWeakHashMap 是使用默认加载因子 (0.75) 和足以容纳指定map中的映射的初始容量创建的。
      参数:
      m - 其映射要放置在此map中的map
      抛出:
      NullPointerException - 如果指定的map为空
      自从:
      1.3
  • 方法详情

    • size

      public int size()
      返回此map中键值映射的数量。此结果是一个快照,可能不会反映未处理的条目,这些条目将在下次尝试访问之前被删除,因为它们不再被引用。
      指定者:
      size 在接口 Map<K,V>
      重写:
      size 在类 AbstractMap<K,V>
      返回:
      此map中键值映射的数量
    • isEmpty

      public boolean isEmpty()
      如果此map不包含键值映射,则返回 true。此结果是一个快照,可能不会反映未处理的条目,这些条目将在下次尝试访问之前被删除,因为它们不再被引用。
      指定者:
      isEmpty 在接口 Map<K,V>
      重写:
      isEmpty 在类 AbstractMap<K,V>
      返回:
      true 如果此map不包含键值映射
    • get

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

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

      null 的返回值不一定指示映射不包含键的映射;map也可能将密钥显式映射到 nullcontainsKey 操作可用于区分这两种情况。

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

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

      public V  put(K  key, V  value)
      将指定值与此map中的指定键相关联。如果map以前包含此键的映射,则旧值将被替换。
      指定者:
      put 在接口 Map<K,V>
      重写:
      put 在类 AbstractMap<K,V>
      参数:
      key - 与指定值关联的键。
      value - 与指定键关联的值。
      返回:
      key 关联的先前值,如果没有 key 的映射,则为 null 。 (返回 null 还可以指示之前将 nullkey 相关联的映射。)
    • putAll

      public void putAll(Map <? extends K ,? extends V > m)
      将指定map中的所有映射复制到此map。这些映射将替换此map对指定map中当前任何键的任何映射。
      指定者:
      putAll 在接口 Map<K,V>
      重写:
      putAll 在类 AbstractMap<K,V>
      参数:
      m - 要存储在此map中的映射。
      抛出:
      NullPointerException - 如果指定的map为空。
    • remove

      public V  remove(Object  key)
      如果存在,则从此弱hash map中删除键的映射。更正式地说,如果此map包含从键 k 到值 v 的映射,使得 (key==null ? k==null : key.equals(k)) ,则该map将被删除。 (map最多可以包含一个这样的映射。)

      返回此map先前与键相关联的值,如果map不包含键的映射,则返回 nullnull 的返回值不一定指示映射不包含键的映射;map也可能将密钥显式映射到 null

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

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

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

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

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

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

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

      public static <K, V> WeakHashMap <K,V> newWeakHashMap(int numMappings)
      创建一个适合预期映射数量的新的空 WeakHashMap。返回的map使用默认的加载因子 0.75,它的初始容量通常足够大,因此可以在不调整map大小的情况下添加预期数量的映射。
      类型参数:
      K - 新map维护的键类型
      V - 映射值的类型
      参数:
      numMappings - 预期的映射数
      返回:
      新创建的map
      抛出:
      IllegalArgumentException - 如果 numMappings 为负
      自从:
      19