位置:首页 > Java技术 > Java基础教程 > Java WeakHashMap类

Java WeakHashMap类

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

这个类提供了利用弱引用的力量最简单的方法。这是实施“注册表样”的数据结构,其中一个项目的效用消失时,它的键不再是可达的任何线程有用。

在WeakHashMap中的功能相同,有一个很重要的例外HashMap中:如果Java的内存管理器不再具有很强的参考指定作为重点对象,在映射中的条目将被删除。

弱引用:如果一个对象的唯一引用是弱引用,垃圾回收器可以在任何时候回收对象占用的内存。它不必等到系统耗尽内存。通常情况下,它会被垃圾回收器下次运行时释放。

在WeakHashMap中类支持四个构造函数。第一种形式构造一个新的空WeakHashMap用默认的初始容量(16)和默认加载因子(0.75):

WeakHashMap() 

第二种形式构造具有给定的初始容量和默认加载因子(0.75)的新的空WeakHashMap:

WeakHashMap(int initialCapacity)

第三种形式构造一个新的空WeakHashMap用给定的初始容量和指定加载因子。

WeakHashMap(int initialCapacity, float loadFactor) 

第四种形式构造一个新WeakHashMap用相同的映射关系与指定的Map:

WeakHashMap(Map t) 

除了从它的父类继承的方法,TreeMap中定义了以下方法:

SN 方法及描述
1 void clear() 
移除所有映射关系从这个映射中。
2 boolean containsKey(Object key) 
返回true如果此映射包含指定键的映射关系。
3 boolean containsValue(Object value) 
返回true如果此映射一个或多个键映射到指定值。
4 Set entrySet()
返回此映射中包含的映射关系的collection视图。
5 Object get(Object key) 
返回指定键映射在此弱哈希映射,或者null,如果映射不包含此键的值。
6 boolean isEmpty()
返回true如果此映射不包含键 - 值映射关系。
7 Set keySet()
Returns a set view of the keys contained in this map.
8 Object put(Object key, Object value) 
关联与此映射中的指定键指定的值。
9 void putAll(Map m) 
复制所有由指定映射的映射到此映射,这些映射关系将替换此映射的所有当前指定映射中键的所有映射关系。
10 Object remove(Object key) 
从此映射中移除(如果存在)映射为这个键。
11 int size() 
返回键 - 值映射关系在这映射的数量。
12 Collection values()
返回此映射中包含的值的collection视图。

例子:

下面的程序说明了几个由这个集合所支持的方法:

import java.util.*;

public class WeakHashMap {
   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(),系统可能永远不会运行垃圾收集器没有多大的内存所使用的程序。对于一个更积极的方案,调用是不必要的。