WeakHashMapとHashMapの違い

1714 ワード

http://mzlly999.iteye.com/blog/1126049
WeakHashMap、このMapの特徴は、自身がkeyへの参照を持っている以外に、このkeyに他の参照がない場合、このmapは自動的にこの値を破棄することです.
例を参照:この例では、2つのMapオブジェクトが宣言されています.1つはHashMapで、1つはWeakHashMapです.同時に、2つのmapにa、bの2つのオブジェクトを入れます.HashMap  removeがaを除去し、a、bがnullを指すと、WeakHashMapのaは自動的に回収されます.これは,aオブジェクトに対してHashMapが  removeが抜けてaをnullに向けると、WeakHashMapにaを指す以外にaを指すポインタが保存されていないので、WeakHashMapは自動的にaを切り捨て、bオブジェクトに対してnullを指すが、HashMapにはbを指すポインタがあるので、
WeakHashMapは残ります

package test;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.WeakHashMap;

public class Test {
	public static void main(String[] args) throws Exception {
		String a = new String("a");
		String b = new String("b");
		Map weakmap = new WeakHashMap();
		Map map = new HashMap();
		map.put(a, "aaa");
		map.put(b, "bbb");

		
		weakmap.put(a, "aaa");
		weakmap.put(b, "bbb");
		
		map.remove(a);
		
		a=null;
		b=null;
		
		System.gc();
		Iterator i = map.entrySet().iterator();
		while (i.hasNext()) {
			Map.Entry en = (Map.Entry)i.next();
			System.out.println("map:"+en.getKey()+":"+en.getValue());
		}

		Iterator j = weakmap.entrySet().iterator();
		while (j.hasNext()) {
			Map.Entry en = (Map.Entry)j.next();
			System.out.println("weakmap:"+en.getKey()+":"+en.getValue());
			
		}
	}

	
}