WeakHashMap - 它的目的是什么,如何正确使用?

3
今天我发现了这篇博客文章,它讨论了在缓存中使用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类?


有了自动装箱,你不必显式地调用 new Long(10)。这样就足够了:map.get(10L); - Matt Ball
可能是 当会使用 WeakHashMap 或 WeakReference? 的重复问题。 - Matt Ball
1
@Matt Ball,这不是重复问题,因为问题是获取WeakHashMap的一些用例,而不是将其与其他结构进行比较。 - Ivaylo Slavov
3个回答

3

当您想要为不受您控制生命周期的对象附加元数据时。一个常见的例子是ClassLoader,但需要注意避免创建值-键引用循环。


那么这个对象就是弱哈希映射中的键,我猜是这样吧? - Ivaylo Slavov
如果您有价值->键循环,您需要的是短暂对。+1为警告。 - Mike Samuel
谢谢提供的信息,现在我明白了WeakHashMap的目的。它实际上是一个相当聪明的存储元数据的解决方案,因为由于键对象不可用,将很快自动处理所有与其关联的元数据。 - Ivaylo Slavov

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

1

有很多用途,但其中一个非常重要的用途是当您想通过Class键入某些内容时。保持对Class实例的强引用可能会占用整个类加载器。

顺便说一下,Guava具有更完整的非强引用映射构造集合。


是的,很好的观点。也许我可以自己使用它来缓存一些元数据,这些元数据是通过反射检索的类型(以避免重复反射调用)。 - Ivaylo Slavov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接