WeakHashMap - 它的目的是什么以及如何正确使用它

时间:2011-06-22 15:55:16

标签: java caching weak-references weakhashmap

今天我发现this blog post讨论了WeakHashMap缓存的用法。它被这样的事实所吸引,即不是值,而是将键存储为弱引用,并且当引用不再存活时,整个键值对将从WeakHashMap中删除。因此,这将导致以下情况发生:

WeakHashMap map = new WeakHashMap();
SomeClass myReference1 = .... 
map.put(new Long(10), myReference1);
// do some stuff, but keep the myReference1 variable around!
SomeClass myReference2 = map.get(new Long(10)); // query the cache
if (myReference2 == null) {
    // this is likely to happen because the reference to the first new Long(10) object
    // might have been garbage-collected at this point
}

我很好奇哪些场景会利用WeakHashMap类?

3 个答案:

答案 0 :(得分:3)

如果要将元数据附加到不控制生命周期的对象。一个常见的例子是ClassLoader,但必须注意避免创建value->键引用周期。

答案 1 :(得分:1)

有许多用途,但其中一个非常重要的用途是当您想要按Class键入内容时。保持对Class个实例的强引用可以固定整个类加载器。

另外,Guava有一套更完整的非强参考映射结构。

答案 2 :(得分:1)

我运行示例代码以了解HashMap和WeakHashMap之间的区别,希望它有所帮助

        Map hashMap= new HashMap();
        Map weakHashMap = new WeakHashMap();

        String keyHashMap = new String("keyHashMap");
        String keyWeakHashMap = new String("keyWeakHashMap");

        hashMap.put(keyHashMap, "helloHash");
        weakHashMap.put(keyWeakHashMap, "helloWeakHash");
        System.out.println("Before: hash map value:"+hashMap.get("keyHashMap")+" and weak hash map value:"+weakHashMap.get("keyWeakHashMap"));

        keyHashMap = null;
        keyWeakHashMap = null;

        System.gc();  

        System.out.println("After: hash map value:"+hashMap.get("keyHashMap")+" and weak hash map value:"+weakHashMap.get("keyWeakHashMap"));

输出将是:

Before: hash map value:helloHash and weak hash map value:helloWeakHash
After: hash map value:helloHash and weak hash map value:null