8.6.6 WeakHashMap实现类

8.6.6 WeakHashMap实现类

WeakHashMapHashMap的用法基本相似。

WeakHashMap和HashMap的区别

WeakHashMapHashMap的区别在于:

  • HashMapkey保留了对实际对象的强引用,这意味着:
    • 只要该HashMap对象不被销毁,该HashMap的所有key所引用的对象就不会被垃圾回收, HashMap也不会自动删除这些key所对应的key-value;
  • Weak HashMapkey只保留了对实际对象的弱引用,这意味着:
    • 如果WeakHashMap对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收, WeakHashMap也可能自动删除这些key所对应的key-value

WeakHashMap特点

WeakHashMap中的每个key对象只持有对实际对象的弱引用,因此,当垃圾回收了该key所对应的实际对象之后, WeakHashMap会自动删除该key对应的key-value

实例

看如下程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.*;

public class WeakHashMapTest {
public static void main(String[] args) {
WeakHashMap whm = new WeakHashMap();
// 将WeakHashMap中添加三个key-value对,
// 三个key都是匿名字符串对象(没有其他引用)
whm.put(new String("语文") , new String("良好"));
whm.put(new String("数学"), new String("及格"));
whm.put(new String("英文"), new String("中等"));
// 将 WeakHashMap中添加一个key-value对,
// 该key是一个系统缓存的字符串对象。
whm.put("java", new String("中等")); / ①
// 输出whm对象,将看到4个key-value对。
System.out.println(whm);
// 通知系统立即进行垃圾回收
System.gc();
System.runFinalization();
// 通常情况下,将只看到一个key-value对。
System.out.println(whm);
}
}

编译、运行上面程序,看到如下运行结果:

1
2
{英文=中等, java=中等, 数学=及格, 语文=良好}
{java=中等}

从上面运行结果可以看出,当系统进行垃圾回收时,删除了WeakHashMap对象的前三个key- value对。这是因为添加前三个key- value对时,这三个key都是匿名的字符串对象,WeakHashMap只保留了对它们的弱引用,这样垃圾回收时会自动删除这三个key-value对。
WeakHashMap对象中第4个组key-value对(第①号代码行)的key("java")是一个字符串直接量,(系统会自动保留对该字符串对象的强引用),所以垃圾回收时不会回收它.

使用WeakHashMap要注意什么

如果需要使用WeakHashMapkey来保留对象的弱引用,则不要让该key所引用的象具有任何强引用,否则将失去使用WeakHashMap的意义