弱哈希映射表的原理其实很好理解,首先我们要知道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被回收。