今天我发现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
类?
答案 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