Map集合的定義
Map用於保存具有映射關係的數據,因此,Map集合裏保存着兩組值,一組值用於保存Map裏的key,另外一組值用於保存Map裏的value,key和value都可以是任何引用類型類型的數據。Map裏的key不允許重複,且是無序的。key和 value之間存在單向一對一關係。
Map與Set、List的聯繫
假如把Map裏的key放在一起,就變爲了一個Set集合。在Java源碼中,Java是先實現了Map,然後通過包裝一個所有value都爲null的Map就實現了Set集合。如果把Map裏的所有value放在一起,它又非常類似於一個List集合: 元素與元素之間可以重複,每個元素可以根據索引(key)來查找。
Map的實現類
HashMap、LinkedHashMap、TreeMap、Properties、EnumMap是Map接口的常用直接或間接實現類。
HashMap
HashMap按Hash算法來存儲集合中的元素,它不能保證key-value對的排列順序,另外,key元素可以是null。HashMap是線程不安全的實現,如果多個線程同時訪問一個HashSet,則必須保證其同步。比如使用Collections類中的synchronizedMap () 獲取Map的線程安全實現版本。
HashMap判斷兩個key相等的標準是:兩個key通過equals()方法比較返回true,兩個key的hashCode值也相等。HashMap判斷兩個value相等的標準:只要兩個對象通過equals() 方法比較返回true即可。
LinkedHashMap
LinkedHashMap是HashMap的子類,它與HashMap不同的是,LinkedHashMap使用雙向鏈表來維護key-value對的順序,該鏈表負責維護Map的迭代順序,迭代順序與key-value對的插入順序保持一致。
LinkedHashMap因爲保持了集合元素的插入順序,所以其性能略低於HashMap的性能,但在迭代訪問Map裏的全部元素時將有較好的性能。
TreeMap
TreeMap是一個紅黑樹數據結構,每個key-value對即作爲紅黑樹的一個節點。根據key值,TreeMap可以保證所有的key-value對處於有序狀態。TreeMap中判斷兩個key相等的標準是:兩個key通過compareTo()方法返回0,則這兩個key是相等的。實際使用時,兩個key通過equals()方法返回的結果應該與compareTo()方法返回的結果保持一致。
TreeMap 的兩種排序方式:
- 自然排序:根據key值,然後將key-value對按升序排列。TreeMap的所有key必須實現Comparable接口,而且所有的key應是同一個類的對象。
- 定製排序:創建TreeMap時,傳入一個Comparator對象,該對象負責對所有的key進行排序。採用定製排序的時不要求Map的key實現Comparable接口。
Properties
Properties類的對象一般用在處理屬性文件上,它可以把Map對象和屬性文件關聯起來,從而可以把Map對象中的key-value對寫入屬性文件中,也可以把屬性文件中的“屬性名=屬性值”加載到Map對象中。
EnumMap
EnumMap是一個與枚舉類一起使用的Map實現,EnumMap中的所有key都必須是單個枚舉類的枚舉值。EnumMap不允許使用null作爲key值,但允許value爲null。EnumMap的性能最好,但它只能使用同一個枚舉類的枚舉值作爲key。
示例
在這裏將利用HashMap和LinkedHashMap 給出簡單的使用實例,同時,給出兩種遍歷Map集合元素方法。
import java.util.HashMap;
import java.util.LinkedHashMap;
public class MapTraverse {
public static void main(String[] args) {
HashMap<String,String> map1= new HashMap<>();
map1.put("星期一","小雨");
map1.put("星期五","大雨");
map1.put("星期三","中雨");
//第一種, 通過foreach循環 遍歷集合元素
for(String key : map1.keySet()) {
System.out.println(key + " " +map1.get(key));
}
LinkedHashMap<String,String> map2 = new LinkedHashMap<>();
map2.put("星期二","陰");
map2.put("星期四","多雲");
map2.put("星期六","晴");
// 第二種,通過Map集合的forEach()方法遍歷元素
map2.forEach((key,value)->System.out.println(key + " " +value));
}
}
輸出的結果
星期三 中雨
星期五 大雨
星期一 小雨
星期二 陰
星期四 多雲
星期六 晴
參考文獻
李剛. 瘋狂Java講義[M]. 北京: 電子工業出版社, 2018.1.