JAVA學習筆記45——四種引用+三種HashMap+同步控制+不可變設置

最近在看JAVA教學的視頻,覺得老師講的很好,同時借用源代碼還有筆記來撰寫本系列博客,記錄自己的學習內容,同時也供看到的人學習。

由於過年,已經整整八天沒有寫博客了,今天繼續~

首先來介紹四種引用(references):


從上面的內容可以看出四種不同的引用對應着各自的功能,用於針對不同回收需求的數據而分別設立的,下面看實例代碼:

import java.lang.ref.WeakReference;
/**
 * 引用分類:強、軟、弱、虛
 * 強與弱引用
 * @author Administrator
 *
 */
public class RefDemo {
	public static void main(String[] args) {
		//字符串常量池 
		String str =new String("bjsxt is very good");
		//弱引用 管理 對象
		WeakReference<String> wr =new WeakReference<String>(str);
		System.out.println("gc運行前:"+wr.get());
		//斷開引用
		str =null;
		//通知回收
		System.gc();
		System.runFinalization();
		//對象被回收
		System.out.println("gc運行後:"+wr.get()); 
	}
	public static void testStrong(){
		//字符串常量池  共享(不能回收),但是如果是new出來的則是共享的,就可以回收了
		String str ="bjsxt is very good";
		//弱引用 管理 對象
		WeakReference<String> wr =new WeakReference<String>(str);
		System.out.println("gc運行前:"+wr.get());
		//斷開引用
		str =null;
		//通知回收
		System.gc();
		System.runFinalization();
		System.out.println("gc運行後:"+wr.get());
	}
}
接下來介紹三種HashMap,對應gc不同的回收方式,用於不同情況下的數據刪除:


import java.util.WeakHashMap;
/**
 * WeakHashMap 鍵爲弱類型,gc運行立即回收
 * @author Administrator
 *
 */
public class WeakHashMapDemo {
	public static void main(String[] args) {
		WeakHashMap<String,String> map =new WeakHashMap<String,String>();
		//測試數據
		//常量池對象,不會回收
		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());
	}
}
import java.util.IdentityHashMap;
/**
 * IdentityHashMap 鍵比較地址去重
 * @author Administrator
 *
 */
public class IdentityHashMapDemo {
	public static void main(String[] args) {
		IdentityHashMap<String ,String> map =new IdentityHashMap<String,String>();
		//常量池中的"a",去重,只保留一個
		map.put("a", "a1");
		map.put("a", "a2");
		System.out.println(map.size());
		//下面的兩個“a”地址不同,而IdentityHashMap只是比較地址
		map.put(new String("a"), "a3");
		map.put(new String("a"), "a4");
		System.out.println(map.size());
	}
}
import java.util.EnumMap;
/**
 * EnumMap要求鍵爲枚舉
 */
public class EnumMapDemo {
	public static void main(String[] args) {
		EnumMap<Season,String> map =new EnumMap<Season,String>(Season.class);
		//存放值
		map.put(Season.SPRING, "春困");
		map.put(Season.SUMMER, "夏無力");
		map.put(Season.AUTUMN, "秋乏");
		map.put(Season.WINTER, "冬眠");
		
		System.out.println(map.size());	
	}
}
//季節
enum Season{
	SPRING,SUMMER,AUTUMN,WINTER
}
最後的內容是同步控制和不可變設置:


示例代碼:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
 * 使用Collections管理同步 容器
 * synchronizedList()
	synchronizedSet()
	synchronizedMap()
 */
public class Demo01 {
	public static void main(String[] args) {
		List<String> list =new ArrayList<String>();
		list.add("a");
		list.add("b");
		//list可以同步
		List<String> synList =Collections.synchronizedList(list);
		System.out.println("線程安全的list製作完畢");
	}
}
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * 只讀設置
 * emptyXxx()  空的不可變的集合 
 * 1、emptyList() 
 *    emptyMap()
 *    emptySet()
2、singletonXxx() 一個元素不可變的集合
singleton(T o) 
singletonList(T o) 
singletonMap(K key, V value) 

3、unmodifiableXxx() 不可變容器(轉爲只讀狀態)
unmodifiableList(List<? extends T> list) 
unmodifiableSet(Set<? extends T> s) 
unmodifiableMap(Map<? extends K,? extends V> m) 
 */
public class Demo02 {
	public static void main(String[] args) {
		Map<String,String> map =new HashMap<String,String>();
		map.put("test", "test");
		map.put("bjsxt", "bjsxt");
		//只讀控制
		Map<String,String> map2 =Collections.unmodifiableMap(map);
		//map2.put("a", "a"); //不能操作
		System.out.println(map2.size());
		//一個元素的容器測試
		List<String> list =Collections.singletonList(new String());
		list.add("test");
		//list.add("bjsxt"); //只能包含一個元素的容器
	}
	public static Set<String> oper(Set<String> set){
		if(null==set){
			return Collections.EMPTY_SET; //外部獲取避免NullPointerException
		}
		//操作
		return set;
	}
}
可以看出,這一篇blog介紹的內容都是對數據回收以及訪問的控制方法,這些在實際應用中是很常見的,同時也常常作爲JAVA程序猿招聘的面試題~



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章