Java WeakHashMap 类

Java WeakHashMap 类

WeakHashMap 是 Map 接口的实现,它只存储对其键的弱引用。只存储弱引用允许在其键在 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相同。

除了从其父类继承的方法外,TreeMap 还定义了以下方法 −

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

示例

以下程序演示了此集合支持的几种方法:

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()的调用,系统可能永远不会运行垃圾收集器,因为程序所使用的内存不多。对于更活跃的程序,该调用就不必要了。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程