如果没有对其中一个键的活动引用,我如何模拟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
之外的其他位置没有活动引用,则必须删除具有指定密钥的条目。我对吗?如果不是,请提出正确的解决方案。
答案 0 :(得分:10)
您的密钥永远不会被垃圾收集,因为缓存了从-128到127的Integer
(假设使用了Integer.valueOf
,它用于自动装箱int
s)。您可以使用该范围之外的值或使用Integer st1 = new Integer(5)
来确保您没有使用缓存对象。
答案 1 :(得分:1)
从-1000到1000(或其周围某处)的整数对象被实习。这意味着自动装箱和valueOf()
返回一个内部存储在Integer
中的对象,因此永远不会收集垃圾。如果您这样做,您将看到预期的行为:
Integer st1 = new Integer(5);
Integer st2 = new Integer(6);
...
st1 = 10;
System.gc();
...