【发布时间】:2020-02-19 13:01:10
【问题描述】:
我在WeakHashMap 中存储了一个对象作为键。现在,如果我更改它的值,然后调用 GC 并打印 map,那么什么都没有。
public static void main(String[] args) throws InterruptedException{
WeakHashMap map = new WeakHashMap();
Integer obj = new Integer(200);
map.put(obj, "sgdjsgd");
obj=new Integer(20);
System.gc();
Thread.sleep(2000);
System.out.println(map);
}
- 预期输出:
{200,"sgdjsgd"} - 实际输出:
{}
【问题讨论】:
-
是什么让您如此期待? 给定键的映射不会阻止垃圾收集器丢弃该键 (
WeakHashMapdocumentation) -
顺便说一句don’t use raw types。并且
Integer构造函数已被弃用,而是使用Integer.valueOf(200)等。 -
它完全按照设计工作。您已经丢弃了对密钥的引用;它只保留对密钥的弱引用;因此,当您执行
get()键时,该值可能已被垃圾收集。 -
当您期望输出
{200,"sgdjsgd"}时,您已经承认地图与包含20的obj变量之间没有关系。那么,为什么您希望obj变量持有对20的引用来阻止收集200键?
标签: java garbage-collection weakhashmap