Map集合應該怎麼用?

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 的兩種排序方式:

  1. 自然排序:根據key值,然後將key-value對按升序排列。TreeMap的所有key必須實現Comparable接口,而且所有的key應是同一個類的對象。
  2. 定製排序:創建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.

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