首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java WeakHashMap类

Java WeakHashMap类
EN

Stack Overflow用户
提问于 2015-01-06 01:31:46
回答 2查看 201关注 0票数 4

我想测试Java的功能,为此,我编写了以下测试:

代码语言:javascript
复制
public class WeakHashMapTest {

public static void main(String args[]) {
    Map<String, Object> weakMap = new WeakHashMap<>();
    String x = new String("x");     
    String x1 = new String("x1");   
    String x2 = new String("x2");   
    weakMap.put(x, x);
    weakMap.put(x1, x1);
    weakMap.put(x2, x2);
    System.out.println("Map size :" + weakMap.size());
    // force all keys be eligible
    x=x1=x2=null;
    // call garbage collector 
    System.gc();
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    System.out.println("Map size :" + weakMap.size());
    System.out.println("Map :" + weakMap);
}

}    

在运行了类WeakMapTest之后,我非常惊讶地得到了以下输出:

在gc之前映射:{x=x,x1=x1,x2=x2}后面的gc:{x=x,x1=x1,x2=x2}

我以为地图会是空的。

也就是说,垃圾收集器没有完成它的工作。但是为什么呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-06 01:37:56

当垃圾收集器不再强可达时,WeakHashMap将由垃圾回收器回收其密钥。

实现注意事项:-- WeakHashMap中的值对象由普通强引用保存。因此,应注意确保值对象不直接或间接地强烈引用它们自己的键,因为这将防止键被丢弃。

但是,因为您使用键本身作为值,所以该值仍然可以强访问,这意味着垃圾收集器无法回收这些键。

但是,如果您使用其他对象作为值,那么对键的唯一引用将是键本身。

代码语言:javascript
复制
weakMap.put(x, new Object());
weakMap.put(x1, new Object());
weakMap.put(x2, new Object());

然后,在清除变量并像您已经完成的那样调用垃圾收集器之后,我得到了输出:

代码语言:javascript
复制
Map size :3
Map size :0
Map :{}

即使对System.gc()的调用不能保证垃圾收集器运行,它看起来也在这里运行。

票数 5
EN

Stack Overflow用户

发布于 2015-01-06 01:34:09

System.gc()实际上是一个运行垃圾收集器的建议。无法保证强制垃圾收集器运行。

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

https://stackoverflow.com/questions/27790750

复制
相关文章

相似问题

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