WeakHashMap示例

Ana*_*and 21 java weakhashmap

我创建一个WeakHashMap作为

WeakHashMap<Employee,String> map = new WeakHashMap<Employee,String>();
map.put(emp,"hello");
Run Code Online (Sandbox Code Playgroud)

其中emp是Employee对象.现在,如果我执行emp = null或者说不再引用emp对象,那么是否将从WeakHashMap中删除该条目,即Map的大小是否为零?
在HashMap的情况下反之亦然?
我对WeakHashMap的理解是否正确?

Yan*_*lea 39

一个非常简单的例子,启发已经说过的话:

import java.util.WeakHashMap;

public class WeakHashMapDemo {

    public static void main(String[] args) {
        // -- Fill a weak hash map with one entry
        WeakHashMap<Data, String> map = new WeakHashMap<Data, String>();
        Data someDataObject = new Data("foo");
        map.put(someDataObject, someDataObject.value);
        System.out.println("map contains someDataObject ? " + map.containsKey(someDataObject));

        // -- now make someDataObject elligible for garbage collection...
        someDataObject = null;

        for (int i = 0; i < 10000; i++) {
            if (map.size() != 0) {
                System.out.println("At iteration " + i + " the map still holds the reference on someDataObject");
            } else {
                System.out.println("somDataObject has finally been garbage collected at iteration " + i + ", hence the map is now empty");
                break;
            }
        }
    }

    static class Data {
        String value;
        Data(String value) {
            this.value = value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

    map contains someDataObject ? true
    ...
    At iteration 6216 the map still holds the reference on someDataObject
    At iteration 6217 the map still holds the reference on someDataObject
    At iteration 6218 the map still holds the reference on someDataObject
    somDataObject has finally been garbage collected at iteration 6219, hence the map is now empty
Run Code Online (Sandbox Code Playgroud)


Ana*_*and 10

我跑的样本代码来了解之间的区别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"));
Run Code Online (Sandbox Code Playgroud)

输出将是:

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


aio*_*obe 6

*将从WeakHashMap中删除条目,即Map的大小是否为零?*

如果emp包含的最后一个引用使得员工强烈可达然后在地图中的条目可以被删除.

Java文档很好地总结了它:

具有弱键的基于散列表的Map实现.当其密钥不再正常使用时,WeakHashMap中的条目将自动被删除.更准确地说,给定密钥的映射的存在不会阻止密钥被垃圾收集器丢弃[...].当一个键被丢弃时,它的条目将被有效地从地图中删除,因此该类的行为与其他Map实现略有不同.

 

在HashMap的情况下反之亦然?

从WeakHashMap中删除条目不会影响程序中的任何其他引用.