Module  java.base
软件包  java.util

Class 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方法返回nullremove方法,以返回false以前似乎在地图,以及密钥集的连续检查,值集合和条目集合,以产生相继较少数量的元素。

    WeakHashMap每个关键对象间接存储为弱引用的指示。 因此,只有在地图的内部和外部的弱引用之后,密钥才会被垃圾收集器清除。

    实现注释: WeakHashMap中的值对象由普通强引用保存。 因此,应注意确保值对象不直接或间接强烈地引用其自己的键,因为这将阻止键被丢弃。 注意,值对象可以通过WeakHashMap本身间接地引用其键; 也就是说,值对象可能强烈地引用一些其他关键对象,其关联值对象又强烈地引用第一个值对象的键。 如果地图中的值不依赖于强调引用它们的地图,那么处理这种情况的一种方法是在插入之前将值本身包含在WeakReferences ,如: m.put(key, new WeakReference(value)) ,然后在每个get展开。

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

    请注意,迭代器的故障快速行为无法保证,因为一般来说,在不同步并发修改的情况下,无法做出任何硬性保证。 失败快速迭代器ConcurrentModificationException扔掉ConcurrentModificationException 因此,编写依赖于此异常的程序的正确性将是错误的: 迭代器的故障快速行为应仅用于检测错误。

    这个类是Java Collections Framework的成员。

    从以下版本开始:
    1.2
    另请参见:
    HashMapWeakReference
    • 构造方法详细信息

      • 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​()
        返回此地图中键值映射的数量。 此结果是一个快照,并且可能不反映在下次尝试访问之前将被删除的未处理条目,因为它们不再被引用。
        Specified by:
        size在接口 Map<K,V>
        重写:
        sizeAbstractMap<K,V>
        结果
        该地图中键值映射的数量
      • isEmpty

        public boolean isEmpty​()
        如果此映射不包含键值映射,则返回true 此结果是一个快照,并且可能不反映在下次尝试访问之前将被删除的未处理条目,因为它们不再被引用。
        Specified by:
        isEmpty在接口 Map<K,V>
        重写:
        isEmptyAbstractMap<K,V>
        结果
        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>
        重写:
        getAbstractMap<K,V>
        参数
        key - 要返回其关联值的键
        结果
        指定键映射到的值,如果此映射不包含键的映射, null
        另请参见:
        put(Object, Object)
      • containsKey

        public boolean containsKey​(Object key)
        如果此映射包含指定键的映射,则返回 true
        Specified by:
        containsKey在接口 Map<K,V>
        重写:
        containsKeyAbstractMap<K,V>
        参数
        key - 要在此地图中存在的密钥要进行测试
        结果
        true如果有一个key的映射; 否则为false
      • put

        public V put​(K key,
                     V value)
        将指定的值与此映射中的指定键相关联。 如果地图先前包含该键的映射,则替换旧值。
        Specified by:
        put在接口 Map<K,V>
        重写:
        putAbstractMap<K,V>
        参数
        key - 要与其关联的指定值的键。
        value - 与指定键相关联的值。
        结果
        先前的值相关联key ,或null如果没有映射key (A null返回也可以指示以前关联的地图nullkey
      • putAll

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

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

        返回此映射先前关联的关键字的值,如果映射不包含关键字的映射,则返回null 返回值为null并不一定表示该映射不包含该键的映射; 地图也可能将密钥明确映射到null

        一旦呼叫返回,该映射将不包含指定键的映射。

        Specified by:
        remove在接口 Map<K,V>
        重写:
        removeAbstractMap<K,V>
        参数
        key - 要从地图中删除其映射的密钥
        结果
        前一个值与 key相关联,或 null如果没有映射 key
      • clear

        public void clear​()
        从这张地图中删除所有的映射。 此呼叫返回后,地图将为空。
        Specified by:
        clear在接口 Map<K,V>
        重写:
        clearAbstractMap<K,V>
      • containsValue

        public boolean containsValue​(Object value)
        如果此映射将一个或多个键映射到指定的值,则返回 true
        Specified by:
        containsValue在接口 Map<K,V>
        重写:
        containsValueAbstractMap<K,V>
        参数
        value - 要在该地图中存在的值要进行测试
        结果
        true如果该地图将一个或多个键映射到指定的值
      • keySet

        public Set<K> keySet​()
        返回此地图中包含的键的Set视图。 该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。 如果在集合中的迭代正在进行中修改映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。 该组支持元件移除,即从映射中相应的映射,经由Iterator.removeSet.removeremoveAllretainAll ,和clear操作。 它不支持addaddAll操作。
        Specified by:
        keySet在接口 Map<K,V>
        重写:
        keySetAbstractMap<K,V>
        结果
        该地图中包含的键的集合视图
      • values

        public Collection<V> values​()
        返回此地图中包含的值的Collection视图。 集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。 如果在集合中的迭代正在进行中修改映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。 该collection支持元素移除,即从映射中相应的映射,经由Iterator.removeCollection.removeremoveAllretainAllclear操作。 它不支持addaddAll操作。
        Specified by:
        values在接口 Map<K,V>
        重写:
        valuesAbstractMap<K,V>
        结果
        该地图中包含的值的集合视图
      • entrySet

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

        public void forEach​(BiConsumer<? super K,? super V> action)
        说明从界面Map复制
        对此映射中的每个条目执行给定的操作,直到所有条目都被处理或操作引发异常。 除非实现类另有指定,否则按照进入设置迭代的顺序执行操作(如果指定了迭代顺序)。操作引发的异常被转发给调用者。
        Specified by:
        forEach在接口 Map<K,V>
        参数
        action - 要为每个条目执行的操作
      • replaceAll

        public void replaceAll​(BiFunction<? super K,? super V,? extends V> function)
        说明从接口Map复制
        将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理或该函数抛出异常。 函数抛出的异常被转发给调用方。
        Specified by:
        replaceAll在接口 Map<K,V>
        参数
        function - 应用于每个条目的功能