java哈希映射干什么的,java 弱哈希映射表WeakHashMap原理
弱哈希映射表的原理其實很好理解,首先我們要知道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被回收。