WeakHashMap不会删除过时的条目

mak*_*aks 4 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());
}
Run Code Online (Sandbox Code Playgroud)

总是输出

6  BB
5  AA
Run Code Online (Sandbox Code Playgroud)

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

Col*_*inD 10

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

  • @maks:`Integer`缓存存储在堆中,但它是静态的,所以它不是GCed.`String`常量被固定在永久世代中. (2认同)