Java java.util.WeakHashMap类使用教程

x33g5p2x  于2021-08-21 转载在 Java  
字(2.6k)|赞(0)|评价(0)|浏览(189)

在这篇文章中,我们将通过实例学习java.util包中的WeakHashMap类。

我们将学到什么?

  1. WeakHashMap类概述
  2. WeakHashMap类构造函数概要
  3. WeakHashMap类构造函数方法
  4. WeakHashMap类实例

1. WeakHashMap类概述

WeakHashMap是一个基于Hash表的Map接口的实现,具有弱键。当WeakHashMap中的一个条目不再被正常使用时,它的键将被自动删除。

空值和空键都被支持。这个类的性能特征与HashMap类相似,并且具有相同的初始容量和负载因子的效率参数。
像大多数集合类一样,这个类是不同步的。可以使用Collections.synchronizedMap方法构造一个同步的WeakHashMap

弱引用--如果一个对象的唯一引用是弱引用,垃圾收集器可以在任何时候回收该对象的内存。它不必等到系统的内存耗尽。通常,它将在下次垃圾收集器运行时被释放。
这个类是Java集合框架的一个成员。

2. WeakHashMap类构造函数

  • WeakHashMap() - 构建一个新的、空的WeakHashMap,具有默认的初始容量(16)和负载系数(0.75)。
  • WeakHashMap(int initialCapacity) - 构建一个新的、空的WeakHashMap,具有给定的初始容量和默认的负载系数(0.75)。
  • WeakHashMap(int initialCapacity, float loadFactor) - 构建一个新的、空的WeakHashMap,具有给定的初始容量和给定的负载因子。
  • WeakHashMap(Map<? extends K,? extends V> m) - 构建一个新的WeakHashMap,其映射关系与指定的地图相同。

3. WeakHashMap类方法

  • void clear()- 移除此地图中的所有映射。
  • boolean containsKey(Object key)- 如果这个地图包含指定键的映射,则返回true。
  • boolean containsValue(Object value)- 如果此地图将一个或多个键映射到指定的值,则返回true。
  • Set<Map.Entry<K,V>> entrySet() -返回此地图中包含的映射的Set视图。
  • void forEach(BiConsumer<? super K,? super V> action) - 对这个地图中的每个条目执行给定的操作,直到所有的条目都被处理完,或者该操作抛出一个异常。
  • V get(Object key) - 返回指定键所映射的值,如果此地图不包含键的映射,则返回空值。
  • boolean isEmpty() - 如果这个地图不包含键值映射,则返回true。
  • Set keySet() - 返回该地图中包含的键的Set视图。
  • V put(K key, V value) - 将指定的值与该地图中指定的键关联。
  • void putAll(Map<? extends K,? extends V> m) - 将指定地图中的所有映射复制到此地图中。
  • V remove(Object key) - 从这个弱哈希图中删除一个键的映射,如果它存在的话。
  • void replaceAll(BiFunction<? super K,? super V,? extends V> function)- 用给定的函数对每个条目调用的结果来替换该条目的值,直到所有条目都被处理或该函数抛出一个异常。
  • int size() - 返回此地图中键值映射的数量。
  • Collection values() - 返回该地图中包含的数值的集合视图。

4. WeakHashMap类实例

我们知道,当WeakHashMap中的一个条目不再被外部引用,并且该键要进行垃圾回收时,该条目将被自动删除。在这个例子中,我们创建了两个键值为 "ACTIVE "和 "INACTIVE "的key1和key2。现在将key1设为null并运行程序。输出应该是一个单项。

import java.util.Map;
import java.util.Map.Entry;
import java.util.WeakHashMap;

public class WeakHashMapExample {
    public static void main(final String[] args) {
        final Map<Key, Project> map = new WeakHashMap<>();
        Key key1 = new Key("ACTIVE");
        final Key key2 = new Key("INACTIVE");
        map.put(key1, new Project(100, "Customer Management System", "Customer Management System"));
        map.put(key2, new Project(200, "Employee Management System", "Employee Management System"));
 
        key1 = null;
        System.gc();
        for (final Entry<Key, Project> entry : map.entrySet()) {
            System.out.println(entry.getKey().getKey() + "   " + entry.getValue());
        }
    }
}

class Key {
    private String key;

    public Key(final String key) {
        super();
        this.key = key;
    }

    public String getKey() {
        return key;
    }

    public void setKey(final String key) {
        this.key = key;
    }
}

输出:

INACTIVE   [project id : 200, project name : Employee Management System, 
           project desc : Employee Management System ]

注意,key1是空的,它的元素被删除并被垃圾回收。

参考资料

https://docs.oracle.com/javase/8/docs/api/java/util/WeakHashMap.html

相关文章

热门文章

更多