1. 程式人生 > 其它 >集合之Map

集合之Map

Java集合分為CollectionMap,學習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元素時,可以照新增的順序實現遍歷。
      原理
      :在HashMap底層結構基礎上,添加了一對指標,指向前一個和後一個元素。對於頻繁的遍歷操作,此類執行效率高於HashMap
  • 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());
}