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
JDK1.8源碼解讀之WeakHashMap解讀
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.