1. 程式人生 > >《瘋狂Java講義(第4版)》-----第8章【Java集合】(Map、Collections)

《瘋狂Java講義(第4版)》-----第8章【Java集合】(Map、Collections)

Map


import java.util.Map;
import java.util.HashMap;

public class Hello{

	public static void main(String[] args){
		Map map = new HashMap();

		map.put("Tom", 98);
		map.put("Jack", 89);
		map.put("Marry", 56);
		map.put(null, null);//null可以作為key,value

		//返回98,返回修改後上一次的value,如果是新新增值,返回null
		System.out.println(map.put("Tom", 78));

		System.out.println(map);//{Tom=78, Jack=89, Marry=56}

		System.out.println(map.containsKey("Jack"));//true
		System.out.println(map.containsValue(89));//true
		
		for(Object key : map.keySet()){
			System.out.println(key+"--->"+map.get(key));
		}
		System.out.println(map.remove("Tom"));//78
		System.out.println(map);//{Jack=89, Marry=56}
	}
}

HashMap

HashMap執行緒不安全,可以用Collections工具類包裝成執行緒安全的。與HashSet類似,判斷兩個key相等的標準也是:兩個key通過equals比較返回true,兩個key的hashCode值也相等。具體見326頁示例程式碼。

與HashSet類似,如果如果用可變物件作為HashMap的key,並且程式修改了作為key的可變物件,可能會出現和HashSet類似的情況:程式再也無法準確訪問到Map中被修改過的key。具體見327頁示例程式碼。

LinkedHashMap

類似於HashSet的LinkedHashSet子類,HashMap也有個子類LinkedHashMap,底層是連結串列維護的,保證了key的順序(插入順序)。


import java.util.LinkedHashMap;

public class Hello{

	public static void main(String[] args){
		LinkedHashMap map = new LinkedHashMap();

		map.put("Tom", 98);
		map.put("Jack", 89);
		map.put("Marry", 56);
		map.put("a", 43);
		map.forEach((key, value)->System.out.println(key+"--->"+value));
		
	}
}

在這裡插入圖片描述

Properties是Hashtable的子類,可以向XML等檔案存取鍵值對 具體見329頁程式碼示例。Hashtable和HashMap功能差不多,執行緒安全,但比較老了,命名都不符合現在Java的命名規範,建議不用。

SortedMap與TreeMap

類比SortedSet介面有TreeSet實現類,SortedMap也有TreeMap實現類。TreeMap也是靠紅黑樹資料結構來維護鍵值對的順序的。TreeMap也有兩種排序方式:自然排序和定製排序。

  • 自然排序:TreeMap所有的key必須實現Comparable介面,key是同一類的物件,否則拋異常:ClassCastException
  • 定製排序:建立TreeMap的時候傳入一個Comparator物件

類似於TreeSet中判斷兩個元素相等的標準,TreeMap中判斷兩個key相等的標準是兩個key通過compareTo比較返回值是0。所以如果是自定義類作為TreeMap的key,在自定義類中重寫equals和compareTo方法的判定結果要保持一致,以防意外發生。

學到此,發現Map和Set有很多類似的地方。其實,值全為null的Map的keySet不就是Set嗎!

Collections工具類

Collections工具類提供了對集合操作的方便方法,還可以把執行緒不安全的集合包裝成執行緒安全的集合(同步控制見339頁)。具體參看該書相關章節或Java官方API。