JDK1.8源码解读之WeakHashMap解读

3 篇文章 0 订阅
2 篇文章 0 订阅

WeakHashMap
    继承:AbstractMap
    实现:Map
    1、key value皆可以为null
    2、非线程安全的,线程安全可以使用Collections#synchronizedMap方式获得
    3、本Map中被Weak的是key,value还是强引用的,在实现的源码中,调用get resize getTable方式时候通过expungeStaleEntries方法进行了删除GC的key的value。
        
    WeakHashMap.Entry
        继承:WeakReference<Key>
        实现:Map.Entry
        原理:单向链表
    原理:
        Entry数组+单向链表。
        被Weak的是key值,所以当key失去强引用的时候,随着GC的操作,Map中的Entry会被回收,
    
         String w1 = new String("one");
         String w2 = new String("two");
         String w3 = new String("three");
         // 新建WeakHashMap
         Map wmap = new WeakHashMap();
         // 添加键值对
         wmap.put(w1, "w1");
         wmap.put(w2, "w2");
         wmap.put(w3, "w3");
 
         // 打印出wmap
         System.out.printf("\nwmap:%s\n",wmap );
 
         // containsKey(Object key) :是否包含键key
         System.out.printf("contains key two : %s\n",wmap.containsKey("two"));
         System.out.printf("contains key five : %s\n",wmap.containsKey("five"));
 
         // containsValue(Object value) :是否包含值value
         System.out.printf("contains value 0 : %s\n",wmap.containsValue(new Integer(0)));
 
         // remove(Object key) : 删除键key对应的键值对
         wmap.remove("three");
 
         System.out.printf("wmap: %s\n",wmap );
 
         // ---- 测试 WeakHashMap 的自动回收特性 ----
         // 将w1设置null。
         // 这意味着“弱键”w1再没有被其它对象引用,调用gc时会回收WeakHashMap中与“w1”对应的键值对
         w1 = null;
         // 内存回收。这里,会回收WeakHashMap中与“w1”对应的键值对
         System.gc();
 
         // 遍历WeakHashMap
         Iterator iter = wmap.entrySet().iterator();
         while (iter.hasNext()) {
             Map.Entry en = (Map.Entry)iter.next();
             System.out.printf("next : %s - %s\n",en.getKey(),en.getValue());
         }
         // 打印WeakHashMap的实际大小
         System.out.printf(" after gc WeakHashMap size:%s\n", wmap.size());
     }
    结果:
        wmap:{three=w3, one=w1, two=w2}
        contains key two : true
        contains key five : false
        contains value 0 : false
        wmap: {one=w1, two=w2}
        next : two - w2
        after gc WeakHashMap size:1
    
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值