java - WeakHashMap的用法?

标签 java hashmap weakhashmap

<分区>

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());

最佳答案

这是因为当对象不再具有来自程序任何其他部分的强引用时,对象将被垃圾收集 (GCed)。

给定一个 WeakHashMap<MyObject, String>那么如果我们执行以下操作:

MyObject mo = new MyObject();
map.put(mo, "Test");
mo = null;

然后条目 mo -> Test将有资格获得GC。这意味着如果您有一个自定义 .equals使用 MyObject 的某些属性的实现测试是否相等,那么您以后不能这样做:

MyObject mo2 = new MyObject();
map.get(mo2);

因为即使你重写了.equals方法可能会说 mo2.equals(mo) == true事实并非如此 mo2 == mo因此该条目可能已经被 GC 处理过。

重点是,如果您保留对 mo 的引用并使用它从 Map 中检索值那么该引用必须是== mo因此有两件事是正确的:

  1. 条目mo -> Test不能被gced
  2. 你可以使用 ==基于 .equals从 map 中检索条目的方法

基本上;由于 GC 将使用强引用来测试对象是否可以被 GC,因此最好确保您的 .equals方法做同样的事情以避免混淆。

关于java - WeakHashMap的用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20742956/

相关文章:

java - 为什么我的 HashMap.get 即使在输入正确的键、值后仍返回空值?

java - 为什么 WeakHashMap 没有删除 WeakReferenced 对象

java - Ivy 依赖版本的调用者优先级

java - 具有完全相同元素的列表和数组是否是糟糕的编程风格?

java - 在 HashMap 中,如果存在重复值,如何将前一个键分配给下一个键

c++ - 关于散列图和术语 C++ 的一些确认

java - HashMap 与 WeakHashMap 一起被垃圾收集?

Java:需要有关 WeakHashMap 的建议

java - 打印ArrayList时出现冗余结果

JAVA- JDBC- ORACLE 连接问题