模块  java.base
软件包  java.util

Class 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方法返回nullremove方法返回false以获取之前false在映射,以及对密钥集,值集合和条目集的连续检查,以连续产生较少数量的元素。

    WeakHashMap每个关键对象间接存储为弱引用的引用对象。 因此,只有在垃圾收集器清除了对映射内部和外部的弱引用之后,才会自动删除密钥。

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

    由所有类的“集合视图方法”返回的集合的iterator方法返回的迭代器是快速失败的 :如果在创建迭代器之后的任何时候对映射进行结构修改,除了通过迭代器自己的remove方法,迭代器将抛出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)
        使用给定的初始容量和默认加载因子(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()
        返回此映射中键 - 值映射的数量。 此结果是快照,可能无法反映在下次尝试访问之前将被删除的未处理条目,因为它们不再被引用。
        Specified by:
        size在界面 Map<K,​V>
        重写:
        size在类 AbstractMap<K,​V>
        结果
        此映射中键 - 值映射的数量
      • isEmpty

        public boolean isEmpty()
        如果此映射不包含键 - 值映射,则返回true 此结果是快照,可能无法反映在下次尝试访问之前将被删除的未处理条目,因为它们不再被引用。
        Specified by:
        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操作可用于区分这两种情况。

        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
      • put

        public V put​(K key,             V value)
        将指定的值与此映射中的指定键相关联。 如果映射先前包含此键的映射,则替换旧值。
        Specified by:
        put在界面 Map<K,​V>
        重写:
        put在类 AbstractMap<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>
        重写:
        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

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

        Specified by:
        remove在界面 Map<K,​V>
        重写:
        remove在类 AbstractMap<K,​V>
        参数
        key - 要从地图中删除其映射的键
        结果
        key相关联的先前值,如果 null没有映射, key
      • clear

        public void clear()
        从此映射中删除所有映射。 此调用返回后,映射将为空。
        Specified by:
        clear在界面 Map<K,​V>
        重写:
        clear在类 AbstractMap<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>
        重写:
        keySet在类 AbstractMap<K,​V>
        结果
        此映射中包含的键的设置视图
      • values

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

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