java - 在weakHashMap中,如果我更新或更改以前存储的键对象,垃圾收集器将删除键值对

标签 java garbage-collection weakhashmap

我已将一个对象作为键存储在 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/

相关文章:

javascript - 我的 PyV8 上下文泄漏内存

javascript - 为什么 "readFile"方法将文件内容放入内存而不是 "readFileSync"?

java - Guava MapMaker().weakKeys().makeMap() 与 WeakHashMap

java - 带有字符串文字和字符串对象的 weakhashmap 的行为

java - 为什么我无法在 'SettingActivity' 中获取个人资料图片?

java - 多线程将相同的内容写入同一个文件?

java - 插入新记录时 hibernate 缓存查询未更新

java - 是否可以使用 vaadin 插件 InvientCharts 动态更改 x 轴和 y 轴标题

JavaScript 内存释放

Java Weak Hash Map - 需要根据值的弱点而不是键删除条目