弱哈希图不会删除过时的条目

  • 本文关键字:过时 删除 哈希图 java
  • 更新时间 :
  • 英文 :


如果其中一个键没有活动引用,我如何对WeakHashMap中的条目删除建模。我有下一个代码:

WeakHashMap<Integer, String> weakMap = new WeakHashMap<Integer, String>();
Integer st1 = 5;
Integer st2 = 6;
String val = "BB";
weakMap.put(st1, "AA");
weakMap.put(st2, val);
st1 = 10;
//st1 = null;
//System.gc();
for (Map.Entry<Integer, String> entry : map.entrySet()) {
   System.out.println(entry.getKey() + "  " + entry.getValue());
}

输出始终为

6  BB
5  AA

但我希望只得到6 BB即使我取消注释行,它仍然会产生相同的输出。据我所知,如果WeakHashMap中的密钥在weakHashMap之外的其他地方没有活动引用,则必须删除具有指定密钥的条目。我说得对吗?如果没有,请提出正确的解决方案。

您的密钥永远不会被垃圾收集,因为-128到127之间的Integer s是缓存的(假设使用了Integer.valueOf,它用于自动装箱的int s)。您可以使用该范围之外的值,或者使用Integer st1 = new Integer(5)来确保您没有使用缓存对象。

从-1000到1000(或附近的某个地方)的Integer对象是内部的。这意味着自动装箱和valueOf()返回一个内部存储在Integer中的对象,因此永远不会进行垃圾收集。如果你这样做,你会看到预期的行为:

Integer st1 = new Integer(5);
Integer st2 = new Integer(6);
...
st1 = 10;
System.gc();
...

最新更新