JDK1.8源碼解讀之WeakHashMap解讀

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
    
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章