天天看點

java weakhashmap_java10 WeakHashMap

WeakHashMap:

對象所占用的區域是不能直接操作的,都是通過引用來操作。

引用分類:1.強引用(StrongReference):gc(垃圾回收機制)運作時不回收。例如字元串常量池。字元串雖然你不用了,但是别人可能使用,字元串常量池是可以共享的,是以不能回收。2.軟引用(SoftReference):gc運作的時候可能回收也可能不回收,jvm記憶體不夠的時候才回收。軟引用可用于制作緩存,常用的資料不需要經常擷取,把它緩存下來,jvm記憶體不夠的時候才把這個對象占用的區域進行回收。3.弱引用(WeakReference):gc運作的時候立即回收。4.虛引用(Phantomreference):類似于無引用,沒有引用,這個引用不能單獨使用,隻要用于跟蹤對象被回收的狀态,比如回收之前把這個對象進行擷取,不能單獨使用,必須與引用隊列(ReferenceQueue)聯合使用。

WeakHashMap:

鍵為弱引用,回收鍵後自動删除key-value對象。

import java.lang.ref.WeakReference;

public classRefDemo {public static voidmain(String[] args) {//"bjsxt is very good"存放在字元串常量池中,是共享的, 不能回收。

String str = "bjsxt is very good";//弱引用 管理 對象

WeakReference wr =new WeakReference(str);

System.out.println("gc運作前:"+wr.get());//gc運作前:bjsxt is very good//斷開引用

str =null;//通知回收

System.gc();//開始回收

System.runFinalization();

System.out.println("gc運作後:"+wr.get()); //gc運作後:bjsxt is very good,是以常量池的對象不能回收。如果改為String str = new String("bjsxt is very good");則第二次輸出為null.

}

}

import java.util.WeakHashMap;

public classWeakHashMapDemo {public static voidmain(String[] args) {

WeakHashMap map =new WeakHashMap();//測試資料//常量池對象,不會回收

map.put("abc", "a");

map.put("d", "test");//gc運作,已被回收

map.put(new String("bjsxt"), "c");

map.put(new String("dsf"), "d");//通知回收

System.gc();

System.runFinalization();

System.out.println(map.size());//2

System.out.println(map.get("abc"));//a

System.out.println(map.get("d"));//test

System.out.println(map.get("bjsxt"));//null,不回收則輸出c

System.out.println(map.get("dsf"));//null,不回收則輸出d//WeakHashMap的作用,可以回收記憶體。

}

}

IdentityHashMap:鍵以位址來區分是不是同一個,與HashMap不同,HashMap比較的是key的hashcode和equals。

public classIdentityHashMapDemo {public static voidmain(String[] args) {

IdentityHashMap map =new IdentityHashMap();//常量池中的"a",共享。

map.put("a", "a1");

map.put("a", "a2");

System.out.println(map.size());//1

map.put(new String("a"), "a3");

map.put(new String("a"), "a4");

System.out.println(map.size());//3

}

}

EnumMap:

鍵必須為枚舉的值(枚舉就是常量的集合)。

構造器:publicEnumMap(指定枚舉class對象)。

public classEnumMapDemo {public static voidmain(String[] args) {

EnumMap map =new EnumMap(Season.class);//Season.class為枚舉class對象//存放值

map.put(Season.SPRING, "春困");

map.put(Season.SUMMER,"夏無力");

map.put(Season.AUTUMN,"秋乏");

map.put(Season.WINTER,"冬眠");

System.out.println(map.size());//4

}

}//季節

enumSeason{

SPRING,SUMMER,AUTUMN,WINTER

}

同步控制與隻讀設定:

同步控制:多線程裡面對這個通路的對象要保證線程安全,主要是容器和集合的線程安全。

常用容器ArrayList、HashSet、HashMap都不是線程安全的(Hashtable是線程安全的,Vector是線程安全的)。Collections提供了synchronizedXxx()方法,将指定容器包裝成同步synchronizedList()、synchronizedSet()、synchronizedMap().

public classDemo01 {public static voidmain(String[] args) {

List list =new ArrayList();

list.add("a");

list.add("b");//list可以同步

List synList =Collections.synchronizedList(list);//這樣list就是線程安全了。

System.out.println("線程安全的list制作完畢");

}

}

public classDemo02 {public static voidmain(String[] args) {

Map map = new HashMap();

map.put("test", "test");

map.put("bjsxt", "bjsxt");//控制隻讀

Map map2 =Collections.unmodifiableMap(map);//map2.put("a", "a");//報錯。不能增操作

System.out.println(map2.size());//一個元素的容器測試

String s = new String();//空字元串

List list = Collections.singletonList(newString());

list.add("test");//報錯,不能操作,已經有了一個元素(空串)

list.add("bjsxt"); //隻能包含一個元素的容器,不能增加。

}public static Set oper(Set set){if(null==set){return Collections.EMPTY_SET; //外部擷取避免NullPointerException

}//操作

return set;

}

}