教程 > Java 教程 > Java 高级 阅读:6

Java WeakHashMap 类

返回 Java 集合框架


WeakHashMap 是 Map 接口的一个实现,它只存储对其键的弱引用。仅存储弱引用允许在 WeakHashMap 之外不再引用其键时对键值对进行垃圾收集。

WeakHashMap 类提供了利用弱引用功能的最简单方法。它对于实现“类似注册表”的数据结构很有用,当任何线程不再能够访问条目的键时,条目的实用程序就会消失。

WeakHashMap 的功能与 HashMap 相同,但有一个非常重要的不同点:如果 Java 内存管理器不再具有对指定为键的对象的强引用,则映射中的条目将被删除。

弱引用 - 如果对对象的唯一引用是弱引用,垃圾收集器可以随时回收对象的内存。它不必等到系统内存不足。通常,它会在下次垃圾收集器运行时被释放。

以下是 WeakHashMap 类支持的构造函数列表。

序号 构造函数 描述
1 WeakHashMap() 此构造函数构造一个新的空 WeakHashMap,具有默认初始容量 (16) 和默认加载因子 (0.75)。
2 WeakHashMap(int initialCapacity) 此构造函数构造一个新的空 WeakHashMap,具有给定的初始容量和默认加载因子,即 0.75。
3 WeakHashMap(int initialCapacity, float loadFactor) 此构造函数构造一个新的空 WeakHashMap,具有给定的初始容量和给定的负载因子。
4 WeakHashMap(Map t) 此构造函数构造一个新的 WeakHashMap,其映射与指定的 Map 相同。

除了继承自其父类的方法外,WeakHashMap 还定义了以下方法

序号 方法 描述
1 void clear() 从此Map中删除所有映射
2 boolean containsKey(Object key) 如果此Map包含指定键的映射,则返回 true。
3 boolean containsValue(Object value) 如果此Map将一个或多个键映射到指定值,则返回 true。
4 Set entrySet() 返回此Map中包含的映射的集合视图。
5 Object get(Object key) 返回此弱哈希Map中指定键映射到的值,如果Map不包含此键的映射,则返回 null。
6 boolean isEmpty() 如果此Map不包含键值映射,则返回 true。
7 Set keySet() 返回此Map中包含的键的集合视图。
8 Object put(Object key, Object value) 将指定的值与此Map中的指定键相关联。
9 void putAll(Map m) 将所有映射从指定映射复制到此映射。 这些映射将替换此映射对当前指定映射中的任何键的任何映射。
10 Object remove(Object key) 如果存在,则从此Map中删除此键的映射。
11 int size() 返回此Map中键值映射的数量。
12 Collection values() 返回此Map中包含的值的集合视图。

示例

以下程序说明了此集合支持的几种方法

import java.util.*;
public class WeakHashMap_Demo {

   private static Map map;
   public static void main (String args[]) {
      map = new WeakHashMap();
      map.put(new String("Maine"), "Augusta");
      
      Runnable runner = new Runnable() {
         public void run() {
            while (map.containsKey("Maine")) {
               try {
                  Thread.sleep(500);
               } catch (InterruptedException ignored) {
               }
               System.out.println("Thread waiting");
               System.gc();
            }
         }
      };
      Thread t = new Thread(runner);
      t.start();
      System.out.println("Main waiting");
      try {
         t.join();
      } catch (InterruptedException ignored) {
      }
   }
}

运行示例

上面代码的运行结果如下

Main waiting
Thread waiting

如果不包括对 System.gc() 的调用,系统可能永远不会运行垃圾收集器,因为程序使用的内存不多。 对于更活跃的程序,调用将是不必要的。


返回 Java 集合框架

查看笔记

扫码一下
查看教程更方便