WeakHashMap的作用 , Talk is cheap, Show you code.

WeakHashMap 与HashMap的区别,很简单。就是WeakHashMap的Key的对象,如果除了自身有对key的引用外(意思就是没有其它外部引用 ),那么,这个Key和Value,就会被自动删除掉,而HashMap的则不会。下面的代码,复制粘贴即可运行,注释也到位,自己花点时间就能懂了。

备注一下: 可以将 obj = null; 这一行注释掉//obj = null;。 然后,将Thread.sleep(3000)调到3000毫秒,或者更高,可以从1秒试到10,或者直接10秒。为什么这样做?因为obj本身是局部变量,在test()方法运行后,这个对象就会被回收,所以,这个WeakHashMap以obj为对象的key,会自动被删除掉,其对应的value也会被删除掉。。。

package com.main;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeSet;
import java.util.WeakHashMap;
import static java.lang.String.format;

import java.io.IOException;

public class WeakApp {
    // 这个是为了方便测试HashMap与WeakHashMap的区别。
    //private static HashMap<Object,String> weakHashMap = new HashMap<>(); 
    private static WeakHashMap<Object,String> weakHashMap = new WeakHashMap<>();

    /**
     * main方法测试
     * @param s
     * @throws IOException
     */
    public static void main(String[] s) throws IOException {

        // 保存对象,并null out对象
        test();

        try {
            // 通知GC回收
            System.gc();
            /**
            * 如果回收后,size还是1,那请在这里加个延时。
            * 我的电脑,不需要延时,gc后,size就为0了,也就是obj被回收了
            **/
            // Thread.sleep(0); 
            } catch (Exception e) {
            e.printStackTrace();
            }


        // 回收完,size为0
        System.out.println("size3="+weakHashMap.size());
        // 打印结果
        Iterator j = weakHashMap.entrySet().iterator();  
        while (j.hasNext()) {  
            Map.Entry en = (Map.Entry)j.next();  
            System.out.println("weakmap2:"+en.getKey()+":"+en.getValue());  

        }  


    }

    private static void test() {

        // 创建key为obj的对象
        Object obj = new Object();

        // 以这个obj对象为key,保存value
        weakHashMap.put(obj, "这是结果");

        // 打印结果
        Iterator j = weakHashMap.entrySet().iterator();  

        while (j.hasNext()) {  
            Map.Entry en = (Map.Entry)j.next();  
            System.out.println("weakmap:"+en.getKey()+":"+en.getValue());  

        }  
        // 打印map的大小,刚保存进去,所以 size为1
        System.out.println("size1="+weakHashMap.size());
        // null out the obj reference。
        obj = null;
        // 虽然obj被null了,但GC还没来得及回收,所以,size还是为1
        System.out.println("size2="+weakHashMap.size());
    }

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值