java中超級重要的map集合之概述
序
今天我們來說一說java中超級重要的map集合.
1、map集合概述
publicinterfaceMap<K,V>
首先看一下map介面,我們可以看到map的存值結構以鍵值對結構,簡單來說,map集合就是一個將鍵(key)對映到值(value)的物件.且一個對映不可以包含重複的鍵,;每個鍵只能對映到一個值.
2、map的儲存結構
如上圖所示,map中儲存資料的方式是一個key對應一個value值,key值可為null,但由於key的值不可重複,故key為null的情況也只可以有一次,value的值不做要求,可以重複也可以多個為null,一對鍵值對底層是放在一個entry陣列中的。
查詢的時候是根據鍵(key)鍵的值的hashcode值找尋value所對應的位置,如果對同一個鍵多次賦value的值,那麼後賦的值會覆蓋前面賦的值.
3、總結一下map的一些特點
-
Map集合是一個雙列集合,一個元素包含兩個值(一個key,一個value)。
-
Map集合中的元素,key和value的資料型別可以相同,也可以不同。
-
-
Map集合中的元素,key是不允許重複的, value是可以重複的。
-
-
Map集合中的元素,key和 value是一一對應的。
4、map的實現類
下面挑幾個比較常用的實現類來講解吧
4.1 HashMap
這是我們日常使用比較多的一個實現類. 它的底層實現方式是陣列+連結串列,key和value的值都可以為null. 初始的記憶體大小為16,一般儲存元素到達大小的一半的時候進行擴容. 執行緒不安全,但優點在於效率比較高. HashMap不支援同步,即同一時刻多個執行緒同時進行寫操作是可能會導致資料的不一致,若需要支援同步的話,可以使用collections的synchronizedmap方法.
4.2 Hashtable
它的底層實現是陣列+連結串列,key和value不可以儲存null. 因為給大多數的操作都加了鎖的緣故,所以Hashtable支援同步操作,但也正是這一點,導致了Hashtable的寫入速度較慢,在對於資料的安全級別要求較高的時候使用.
4.3 ConcurrentHashMap
它的底層實現是分段陣列+連結串列. Hashtable的synchronized是針對整張Hash表的,即每次鎖住整張表讓執行緒獨佔,ConcurrentHashMap允許多個修改操作併發進行,其關鍵在於使用了鎖分離技術 通過把整個Map分為N個Segment,可以提供相同的執行緒安全,但是效率提升N倍,預設提升16倍.
4.4 linkedHashMap
LinkedHashMap可以認為是HashMap和LinkedList合體,即它既使用HashMap操作資料結構,又使用LinkedList維護插入元素的先後順序. 內部維持了一個雙向連結串列. LinkedHashMap是HashMap的子類. 它的元素按照插入順序排列. 遍歷速度較慢.
4.5 TreeMap
基於紅黑樹(Red-Black tree)的 NavigableMap 實現.該對映根據其鍵的自然順序進行排序,或者根據建立對映時提供的 Comparator 進行排序.具體取決於使用的構造方法。優點是鍵值可排序,唯一,值有序可重複,底層資料結構是平衡二叉樹.
5、map介面中的常用方法
-
public V put(K key, V value):把指定的鍵與指定的值新增到Map集合中.
-
public V remove(Object key):把指定的鍵所對應的鍵值對元素在Map集合中刪除返回被刪除元素的值.
-
public V get(Object key):根據指定的鍵,在Map集合中獲取對應的值.
-
boolean containsKey(Object key):判斷集合中是否包含指定的鍵.
-
public SetkeySet():獲取Map集合中所有的鍵,儲存到Set集合中.
-
public SetkeySet():獲取Map集合中所有的鍵,儲存到Set集合中.
6、map遍歷
下面將一些map集合遍歷的幾種方式
6.1 使用 Entry 實現
在for迴圈中使用 Entry 實現 Map 的遍歷
- Map<String,String>map=newHashMap<>();
- map.put("大白","白色");
- map.put("柯基","黃色");
- for(Map.Entry<String,String>entry:map.entrySet()){
- StringmapKey=entry.getKey();
- StringmapValue=entry.getValue();
- System.out.println(mapKey+":"+mapValue);
- }
執行結果:
6.2 通過 Entry 獲取 key 或者 values
在for迴圈中遍歷key或者values,一般適用於只需要map中的key或者value時使用,在效能上比使用entrySet較好
- Map<String,String>map=newHashMap<>();
- map.put("大白","白色");
- map.put("柯基","黃色");
- //key
- for(Stringkey:map.keySet()){
- System.out.println(key);
- }
- //value
- for(Stringvalue:map.values()){
- System.out.println(value);
- }
執行結果:
6.3 通過 Iterator 遍歷
- Map<String,String>map=newHashMap<>();
- map.put("大白","白色");
- map.put("柯基","黃色");
- Iterator<Entry<String,String>>entries=map.entrySet().iterator();
- while(entries.hasNext()){
- Entry<String,String>entry=entries.next();
- Stringkey=entry.getKey();
- Stringvalue=entry.getValue();
- System.out.println(key+":"+value);
- }
執行結果:
6.4 通過鍵找值遍歷
通過鍵找值遍歷,這種方式的效率比較低,因為本身從鍵取值是耗時的操作。
- Map<String,String>map=newHashMap<>();
- map.put("大白","白色");
- map.put("柯基","黃色");
- for(Stringkey:map.keySet()){
- Stringvalue=map.get(key);
- System.out.println(key+":"+value);
- }
執行結果:
小結
好了,以上就是我自己總結的一些關於map的知識還有map遍歷的四種方式的程式碼實現.有不對或者不足的地方歡迎大家指點,共同學習共同進步,謝謝!
-