1. 程式人生 > 實用技巧 >java中超級重要的map集合之概述

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的一些特點

  1. Map集合是一個雙列集合,一個元素包含兩個值(一個key,一個value)。

    1. Map集合中的元素,key和value的資料型別可以相同,也可以不同。

    1. Map集合中的元素,key是不允許重複的, value是可以重複的。

    1. 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介面中的常用方法

    1. public V put(K key, V value):把指定的鍵與指定的值新增到Map集合中.

    2. public V remove(Object key):把指定的鍵所對應的鍵值對元素在Map集合中刪除返回被刪除元素的值.

    3. public V get(Object key):根據指定的鍵,在Map集合中獲取對應的值.

    4. boolean containsKey(Object key):判斷集合中是否包含指定的鍵.

    5. public SetkeySet():獲取Map集合中所有的鍵,儲存到Set集合中.

    6. public SetkeySet():獲取Map集合中所有的鍵,儲存到Set集合中.

    6、map遍歷

    下面將一些map集合遍歷的幾種方式

    6.1 使用 Entry 實現

    在for迴圈中使用 Entry 實現 Map 的遍歷

    1. Map<String,String>map=newHashMap<>();
    2. map.put("大白","白色");
    3. map.put("柯基","黃色");
    4. for(Map.Entry<String,String>entry:map.entrySet()){
    5. StringmapKey=entry.getKey();
    6. StringmapValue=entry.getValue();
    7. System.out.println(mapKey+":"+mapValue);
    8. }

    執行結果:

    6.2 通過 Entry 獲取 key 或者 values

    在for迴圈中遍歷key或者values,一般適用於只需要map中的key或者value時使用,在效能上比使用entrySet較好

    1. Map<String,String>map=newHashMap<>();
    2. map.put("大白","白色");
    3. map.put("柯基","黃色");
    4. //key
    5. for(Stringkey:map.keySet()){
    6. System.out.println(key);
    7. }
    8. //value
    9. for(Stringvalue:map.values()){
    10. System.out.println(value);
    11. }

    執行結果:

    6.3 通過 Iterator 遍歷

    1. Map<String,String>map=newHashMap<>();
    2. map.put("大白","白色");
    3. map.put("柯基","黃色");
    4. Iterator<Entry<String,String>>entries=map.entrySet().iterator();
    5. while(entries.hasNext()){
    6. Entry<String,String>entry=entries.next();
    7. Stringkey=entry.getKey();
    8. Stringvalue=entry.getValue();
    9. System.out.println(key+":"+value);
    10. }

    執行結果:

    6.4 通過鍵找值遍歷

    通過鍵找值遍歷,這種方式的效率比較低,因為本身從鍵取值是耗時的操作。

    1. Map<String,String>map=newHashMap<>();
    2. map.put("大白","白色");
    3. map.put("柯基","黃色");
    4. for(Stringkey:map.keySet()){
    5. Stringvalue=map.get(key);
    6. System.out.println(key+":"+value);
    7. }

    執行結果:

    小結

    好了,以上就是我自己總結的一些關於map的知識還有map遍歷的四種方式的程式碼實現.有不對或者不足的地方歡迎大家指點,共同學習共同進步,謝謝!