WeakHashMap 与HashMap的区别,很简单。就是WeakHashMap的Key的对象,如果除了自身有对key的引用外(意思就是没有其它外部引用 ),那么,这个Key和Value,就会被自动删除掉,而HashMap的则不会。下面的代码,复制粘贴即可运行,注释也到位,自己花点时间就能懂了。
备注一下: 可以将 obj = null; 这一行注释掉//obj = null;。 然后,将Thread.sleep(3000)调到3000毫秒,或者更高,可以从1秒试到10,或者直接10秒。为什么这样做?因为obj本身是局部变量,在test()方法运行后,这个对象就会被回收,所以,这个WeakHashMap以obj为对象的key,会自动被删除掉,其对应的value也会被删除掉。。。
package com.main;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeSet;
import java.util.WeakHashMap;
import static java.lang.String.format;
import java.io.IOException;
public class WeakApp {
// 这个是为了方便测试HashMap与WeakHashMap的区别。
//private static HashMap<Object,String> weakHashMap = new HashMap<>();
private static WeakHashMap<Object,String> weakHashMap = new WeakHashMap<>();
/**
* main方法测试
* @param s
* @throws IOException
*/
public static void main(String[] s) throws IOException {
// 保存对象,并null out对象
test();
try {
// 通知GC回收
System.gc();
/**
* 如果回收后,size还是1,那请在这里加个延时。
* 我的电脑,不需要延时,gc后,size就为0了,也就是obj被回收了
**/
// Thread.sleep(0);
} catch (Exception e) {
e.printStackTrace();
}
// 回收完,size为0
System.out.println("size3="+weakHashMap.size());
// 打印结果
Iterator j = weakHashMap.entrySet().iterator();
while (j.hasNext()) {
Map.Entry en = (Map.Entry)j.next();
System.out.println("weakmap2:"+en.getKey()+":"+en.getValue());
}
}
private static void test() {
// 创建key为obj的对象
Object obj = new Object();
// 以这个obj对象为key,保存value
weakHashMap.put(obj, "这是结果");
// 打印结果
Iterator j = weakHashMap.entrySet().iterator();
while (j.hasNext()) {
Map.Entry en = (Map.Entry)j.next();
System.out.println("weakmap:"+en.getKey()+":"+en.getValue());
}
// 打印map的大小,刚保存进去,所以 size为1
System.out.println("size1="+weakHashMap.size());
// null out the obj reference。
obj = null;
// 虽然obj被null了,但GC还没来得及回收,所以,size还是为1
System.out.println("size2="+weakHashMap.size());
}
}