java 弱哈希映射表WeakHashMap原理

来源:互联网 发布:什么是淘宝直通车图片 编辑:程序博客网 时间:2024/06/05 01:49

弱哈希映射表的原理其实很好理解,首先我们要知道HashMap的原理。如果我们将一个对象a以及他的引用A作为一个key值关联某个Value值后put入HashMap中,那么这个a对象的引用不仅仅有A,而且有一个HashMap中持有的引用,一共两个引用。WeakHashMap的原理也相同,此时在WeakHashMap中的a也持有两个引用,一个是A,另一个是WeakHashMap的散列表持有的引用。

那么现在分析弱哈希映射表的原理:WeakHashMap散列表持有所有key的引用是弱引用。弱引用的概念是:如果一个对象仅有一个弱引用指向它,那么在下次GC进行回收时会将其回收。所以说,上述的a对象,如果A引用不再指向它,而且也没有其他的地方使用到a对象形成它的引用的话,在下一次垃圾回收时a对象表示的k-v对将被从WeakHashMap中删除。

下面的例子表示当A变为null时,WeakHashMap中的a被回收:

package Test;import java.util.*;public class test {    public static void main(String[] args) throws Exception {        String a = new String("a");        Map weakmap = new WeakHashMap();        weakmap.put(a, "aaa");        a = null;        System.gc();        Iterator j = weakmap.entrySet().iterator();        while (j.hasNext()) {            Map.Entry en = (Map.Entry) j.next();            System.out.println("weakmap:" + en.getKey() + ":" + en.getValue());        }    }}

上述例子不会输出任何,因为此时weakmap中的a已经被回收。

下面例子表示当A变为null时,但是HashMap中仍然保存着a的一个引用,不能满足回收条件,WeakHashMap中的a不被回收:

package Test;import java.util.*;public class test {    public static void main(String[] args) throws Exception {        String a = new String("a");        Map weakmap = new WeakHashMap();        Map map = new HashMap();        map.put(a, "aaa");        weakmap.put(a, "aaa");        //map.remove(a);        a = null;        System.gc();        Iterator j = weakmap.entrySet().iterator();        while (j.hasNext()) {            Map.Entry en = (Map.Entry) j.next();            System.out.println("weakmap:" + en.getKey() + ":" + en.getValue());        }    }}

结果输出:

weakmap:a:aaa

如果我们将上面代码中的注释行:map.remove(a);加入其中,那么最后会没有任何输出,因为HashMap中保存着a的最后一个非弱引用,如果此引用也被删除则a被回收。