首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WeakHashMap不会删除过时的条目

WeakHashMap不会删除过时的条目
EN

Stack Overflow用户
提问于 2012-01-16 04:42:54
回答 2查看 574关注 0票数 5

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

代码语言:javascript
复制
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());
}

输出始终为

代码语言:javascript
复制
6  BB
5  AA

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-16 04:47:20

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

票数 10
EN

Stack Overflow用户

发布于 2012-01-16 04:46:42

从-1000到1000 (或其附近的某个位置)的Integer对象被占用。这意味着自动装箱和valueOf()返回一个存储在Integer内部的对象,因此永远不会被垃圾回收。如果这样做,您将看到预期的行为:

代码语言:javascript
复制
Integer st1 = new Integer(5);
Integer st2 = new Integer(6);

...

st1 = 10;

System.gc();

...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8873216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档