我已将一个对象作为键存储在 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"}
- 实际输出:
{}
最佳答案
user207421 说得非常准确:您的代码完全按照设计运行。我不清楚你到底是如何期待其他东西的,但我想指出:
- 您的代码不会改变 map 内的任何内容。将新值 20 分配给 obj 只会更改该变量。映射中的键仍然是包含值 200 的
Integer
。 - 将 20 分配给
obj
可确保映射中没有对键 200 的其他引用,这就是允许垃圾收集器从映射中删除该键的原因。<
如果您想更改 map 中的键:永远不要。 HashMap (包括 WeakHashMap
)通过哈希码存储对象。更改关键对象很可能会更改哈希码。因此,即使 key 在 map 中, map 也无法再次找到它。如果您需要此功能,则必须首先从 map 中删除 key ,然后插入新 key :
String value = map.remove(obj);
obj = Integer.valueOf(20);
map.put(obj, value);
通过对代码的更改,我得到以下输出:
{20=sgdjsgd}
关于java - 在weakHashMap中,如果我更新或更改以前存储的键对象,垃圾收集器将删除键值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58520169/