Java - WeakHashMap类


Java - WeakHashMap类

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

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

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

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

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

Sr.No. 构造函数和描述
1

WeakHashMap()

此构造函数使用默认初始容量(16)和默认加载因子(0.75)构造一个新的空WeakHashMap。

2

WeakHashMap(int initialCapacity)

此构造函数使用给定的初始容量和默认加载因子(0.75)构造一个新的空WeakHashMap。

3

WeakHashMap(int initialCapacity,float loadFactor)

此构造函数使用给定的初始容量和给定的加载因子构造一个新的空WeakHashMap。

4

WeakHashMap(Map t)

此构造函数构造一个新的WeakHashMap,其映射与指定的Map相同。

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

Sr.No. 方法和描述
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()

返回此映射中包含的键的set视图。

8

Object put(Object key, Object value)

将指定的值与此映射中的指定键相关联。

9

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