8.6.6 WeakHashMap实现类
8.6.6 WeakHashMap实现类
WeakHashMap
与HashMap
的用法基本相似。
WeakHashMap和HashMap的区别
WeakHashMap
与HashMap
的区别在于:
HashMap
的key
保留了对实际对象的强引用
,这意味着:- 只要该
HashMap
对象不被销毁,该HashMap
的所有key
所引用的对象就不会被垃圾回收,HashMap
也不会自动删除这些key
所对应的key-value
对;
- 只要该
Weak HashMap
的key
只保留了对实际对象的弱引用
,这意味着:- 如果
WeakHashMap
对象的key
所引用的对象没有被其他强引用变量所引用,则这些key
所引用的对象可能被垃圾回收,WeakHashMap
也可能自动删除这些key
所对应的key-value
对。
- 如果
WeakHashMap特点
WeakHashMap
中的每个key
对象只持有对实际对象的弱引用,因此,当垃圾回收了该key
所对应的实际对象之后, WeakHashMap
会自动删除该key
对应的key-value
对。
实例
看如下程序:
1 | import java.util.*; |
编译、运行上面程序,看到如下运行结果:
1 | {英文=中等, java=中等, 数学=及格, 语文=良好} |
从上面运行结果可以看出,当系统进行垃圾回收时,删除了WeakHashMap
对象的前三个key- value
对。这是因为添加前三个key- value
对时,这三个key
都是匿名的字符串对象,WeakHashMap
只保留了对它们的弱引用
,这样垃圾回收时会自动删除这三个key-value
对。WeakHashMap
对象中第4个组key-value
对(第①号代码行)的key
("java"
)是一个字符串直接量,(系统会自动保留对该字符串对象的强引用
),所以垃圾回收时不会回收它.
使用WeakHashMap要注意什么
如果需要使用WeakHashMap
的key
来保留对象的弱引用,则不要让该key
所引用的象具有任何强引用,否则将失去使用WeakHashMap
的意义