gpt4 book ai didi

java - WeakHashMap的用法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:21:37 30 4
gpt4 key购买 nike

<分区>

WeakHashMap是Map接口(interface)的实现,值对象的内存可以通过Grabage Collector回收如果程序的任何部分不再引用相应的键。因此,如果程序中不再使用 key 。它的条目对象将被垃圾收集,无论其用途如何。到这里为止都清楚

这与 HashMap 不同,后者的值对象保留在 HashMap 中,即使不再引用键也是如此。我们需要显式调用 HashMap 对象上的 remove() 方法删除值。调用 remove 只会从 map 中删除条目。它的 GC 准备就绪 取决于它是否仍在程序中的某处使用。

Please find this coding example explaining above

根据我的理解,在 HashMap 上使用 Wea​​kHashMap

我的理解是,只有当我们想要确保值对象被 Grabage Collector 回收时,我们才应该使用 Wea​​kHashMap key 不再被程序的任何部分引用。这使程序内存更高效 我的理解是否正确?

根据 JavaDocs 使用 Wea​​kHashMap ,我可以发现这个声明

This class is intended primarily for use with key objects whose equals methods test for object identity using the == operator.

我不明白上面的陈述是什么意思,以及它与我对 WeakHashMap 用法的理解有何不同。其实我不明白这个说法与WeakHashMap的使用有什么关系?

更新:- 进一步仔细阅读下面声明的 javadocs

An entry in a WeakHashMap will automatically be removed when its key is no longer in ordinary use. More precisely, the presence of a mapping for a given key will not prevent the key from being discarded by the garbage collector, that is, made finalizable, finalized, and then reclaimed. When a key has been discarded its entry is effectively removed from the map, so this class behaves somewhat differently from other Map implementations.

为了我和其他人的利益,我正在修改我的理解

根据我修改后的理解,在 HashMap 上使用 Wea​​kHashMap

只有当我们想要确保键值对在 GC 运行时从 map 中删除时,我们才应该选择 WeakHashMap,当 key 除了 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());

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com