《瘋狂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。