有了HashMap和Concurrent HashMap,WeakHashMap的用途是什么?

Pra*_*eek 4 java hashmap concurrenthashmap java.util.concurrent weakhashmap

当已经有其他实现可用时,还需要引入 Weak HashMap 吗?

简而言之,我有两个问题:

  • Why jdk has WeakHashMap when there is HashMap and Concurrent HashMap in java ?

  • What is the use of it in real life applications ?

编辑 :

虽然 WeakHashmap key 是弱引用,但它们仍然引用了一些东西,而不是 GC 在 WeakHashMap 中丢弃键的依据。

Kon*_*kov 5

WeakReferences 和 WeakHashMap 的一种常见用途是向对象添加属性。有时您想要向对象添加一些功能或数据,但子类化和/或组合不是一个选项,在这种情况下,显而易见的做法是创建一个哈希图,将您想要扩展的对象链接到您想要添加的属性。然后每当您需要该房产时,您只需在地图上查找即可。但是,如果您添加属性的对象往往会被大量销毁和创建,则最终可能会在地图中出现大量旧对象,从而占用大量内存

如果您使用 Wea​​kHashMap,则一旦程序的其余部分不再使用对象,它们就会离开您的映射,这是所需的行为。

a 的键WeakHashMap具有弱引用。如果该键已被垃圾回收,则WeakHashMap对象中的条目将自动删除。正常情况下不会发生这种情况HashMap。如果该键被垃圾回收,则该条目不会被删除。

在示例中,我采用了 1HashMap和 1 WeakHashMap。我将把条目放入两个对象中,然后我们将引用键设置为null,然后进行垃圾收集。并再次检查条目。在HashMap对象中会有条目,但在WeakHashMap对象中不会有条目。

import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;

public class WeakHashMapTest {
    public static void main(String[] args) {
        Map hashMap= new HashMap();

        Map weakHashMap = new WeakHashMap();

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

        hashMap.put(keyHashMap, "Ankita");
        weakHashMap.put(keyWeakHashMap, "Atul");
        System.gc();
        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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出将是:

Before: hash map value:Ankita and weak hash map value:Atul
After: hash map value:Ankita and weak hash map value:null
Run Code Online (Sandbox Code Playgroud)

更多信息:


归档时间:

查看次数:

4810 次

最近记录:

9 年,8 月 前