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;
}
}