長按識別下方二維碼,即可"關注"公眾號
每天早晨,干貨準時奉上!
序
今天我們來說一說java中超級重要的map集合.
1、map集合概述
public interface Map<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 = new HashMap<>(); map.put("大白", "白色"); map.put("柯基", "黃色"); for(Map.Entry<String, String> entry : map.entrySet()){ String mapKey = entry.getKey(); String mapValue = entry.getValue(); System.out.println(mapKey+":"+mapValue); }運行結果:
6.2 通過 Entry 獲取 key 或者 values
在for回圈中遍歷key或者values,一般適用于只需要map中的key或者value時使用,在性能上比使用entrySet較好
Map<String,String> map = new HashMap<>(); map.put("大白", "白色"); map.put("柯基", "黃色"); //key for(String key : map.keySet()){ System.out.println(key); } //value for(String value : map.values()){ System.out.println(value); }運行結果:
6.3 通過 Iterator 遍歷
Map<String,String> map = new HashMap<>(); map.put("大白", "白色"); map.put("柯基", "黃色"); Iterator<Entry<String, String>> entries = map.entrySet().iterator(); while(entries.hasNext()){ Entry<String, String> entry = entries.next(); String key = entry.getKey(); String value = entry.getValue(); System.out.println(key+":"+value); }運行結果:
6.4 通過鍵找值遍歷
通過鍵找值遍歷,這種方式的效率比較低,因為本身從鍵取值是耗時的操作,
Map<String,String> map = new HashMap<>(); map.put("大白", "白色"); map.put("柯基", "黃色"); for(String key : map.keySet()){ String value = map.get(key); System.out.println(key+":"+value); }運行結果:
小結
好了,以上就是我自己總結的一些關于map的知識還有map遍歷的四種方式的代碼實作.有不對或者不足的地方歡迎大家指點,共同學習共同進步,謝謝!
阿淼個人微信
添加即送全套程式員必讀資料
→ 精選技術資料共享
→ 高手如云交流社群
?來和大家一起進步吧!
覺得不錯就點個在看吧
CSDN認證博客專家
Java
Java學習之道
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/33113.html
標籤:其他
