集合之Map
阿新 • • 發佈:2021-10-09
Java集合分為Collection
和Map
,學習Map前需先了解Collection
集合之Collection
介紹
Map:元素是按照鍵值對形式儲存的。每一對元素由兩部分組成,分別叫鍵和值,鍵是唯一的,值是可以重複的。
Map介面有三個比較重要的實現類,分別是HashMap、TreeMap和HashTable。
- TreeMap是有序的,HashMap和HashTable是無序的。
- Hashtable的方法是同步的,HashMap的方法不是同步的。這是兩者最主要的區別。
這就意味著:
- Hashtable是執行緒安全的,HashMap不是執行緒安全的。HashMap效率較高,Hashtable效率較低。
- 如果對同步性或與遺留程式碼的相容性沒有任何要求,建議使用HashMap。 檢視Hashtable的原始碼就可以發現,除建構函式外,Hashtable的所有 public 方法宣告中都有 synchronized關鍵字,而HashMap的原始碼中則沒有。
- Hashtable不允許null值,HashMap允許null值(key和value都允許)
- 父類不同:Hashtable的父類是Dictionary,HashMap的父類是AbstractMap
常用實現類
-
HashMap
作為Map的主要實現類;執行緒不安全的,效率高,儲存key和對應的value,key可以為null- LinkedHashMap
HashMap的子類。保證在遍歷map元素時,可以照新增的順序實現遍歷。
原理
- LinkedHashMap
-
TreeMap
按新增的key-value對進行排序,實現排序遍歷。此時考慮key的自然排序或定製排序底層使用紅黑樹 -
Hashtable
作為古老的實現類;執行緒安全的,效率低;不能儲存null的key和value。常用來處理配置檔案。key和value都是String型別
儲存結構的理解
- Map中的key: 無序的、不可重複的
使用Set儲存key ---> key所在的類要重寫equals()和hashCode() (以HashMap為例) - Map中的value: 無序的、可重複的
使用Collection儲存value --->value所在的類要重寫equals() - 鍵值對:key-value構成了一個Entry物件。
- Map中的entry: 無序的、不可重複的,使用Set儲存所有的entry
常用方法
新增 、 刪除、修改操作
Object put(Object key,Object value):將指定key-value新增到(或修改)當前map物件中
void putAll(Map m):將m中的所有key-value對存放到當前map中
Object remove(Object key):移除指定key的key-value對,並返回value
void clear():清空當前map中的所有資料
查詢的操作
Object get(Object key):獲取指定key對應的value
boolean containsKey(Object key):是否包含指定的key
boolean containsValue(Object value):是否包含指定的value
int size():返回map中key-value對的個數
boolean isEmpty():判斷當前map是否為空
boolean equals(Object obj):判斷當前map和引數物件obj是否相等
map集合的遍歷
通過獲取所有的key
//map.keySet() 得到所有key的集合
Set keys = map.keySet();
for (Object key : keys) {
System.out.println(key + "->" + map.get(key));
}
獲取所有的value
HashMap<String, String> map = new HashMap<>();
map.put("wanzi","莉香");
map.put("三上","里美");
//map.values(): 集合
for (String value : map.values()) {
System.out.println(value);
}
通過Map.entrySet遍歷key和value,推薦,尤其是容量大時
//map.entrySet()): Set<Map.Entry<K,V>>
for(Map.Entry<String,String> entry : map.entrySet()){
entry.getKey(); //當前key
entry.getValue(); //當前value
System.out.println("key:" + entry.getKey() + "value:" + entry.getValue());
}