WeakHashMap 是 Map 接口的一个实现,如果相应的键不再被程序的任何部分引用,则 Grabage Collector 可以回收值对象的内存。因此,如果程序中不再使用密钥。无论其用途如何,它的 Entry 对象都将被垃圾回收。到这里为止很清楚
这与 HashMap 不同,其中值对象保留在 HashMap 中,即使不再引用 key。我们需要在 HashMap 对象上显式调用 remove() 方法来删除该值。调用 remove 只会从地图中删除条目。它对 GC 的准备情况将取决于它是否仍在程序中的某个地方使用。
根据我的理解,在 HashMap 上使用 WeakHashMap
我的理解是,只有当我们想要确保在程序的任何部分不再引用键时,Grabage Collector 回收值对象时,我们才应该使用 WeakHashMap。这使程序内存高效我的理解在这里正确吗?
根据JavaDocs使用 WeakHashMap ,我可以发现这个语句
此类主要用于关键对象,其 equals 方法使用 == 运算符测试对象身份。
我没有明白上述陈述的含义以及它与我对 WeakHashMap 用法的理解有何不同。实际上我没有明白这个声明与 WeakHashMap 的使用有什么关系?
更新:- 在进一步仔细阅读下面的声明 javadocs
WeakHashMap 中的条目在其键不再常用时将被自动删除。更准确地说,给定键的映射的存在不会阻止该键被垃圾收集器丢弃,也就是说,使其可终结,最终确定,然后回收。当一个键被丢弃时,它的条目被有效地从映射中删除,所以这个类的行为与其他映射实现有些不同。
为了我和他人的利益,我正在修改我的理解
根据我修改后的理解,在 HashMap 上使用 WeakHashMap
仅当我们想要确保在 GC 运行时从 map 中删除键值对时,我们才应该使用 WeakHashMap,此时键不再被普通使用,而不是 map 本身。
例子是:-
WeakHashMap<Integer, String> numbers = new WeakHashMap<Integer, String>();
numbers.put(new Integer(1), "one");// key only used within map not anywhere else
numbers.put(new Integer(2), "two");
System.out.println(numbers.get(new Integer(1))); // prints "one"
System.gc();
// let's say a garbage collection happens here
System.out.println(numbers.get(new Integer(1))); // prints "null"
System.out.println(numbers.get(new Integer(2))); // prints "null"
Object key = new Object();
m1.put(key, c1);
System.out.println(m1.size());
key = null or new Object() ; // privious key only used within map not anywhere else
System.gc();
Thread.sleep(100);
System.out.println(m1.size());