Java學習之Map集合

微信圖片_20190423212719.jpg
Map 是一個介面,沒有繼承Collection介面,是一種把鍵物件和值物件對映的集合,它的每一個元素都包含一對鍵物件和值物件,只要給出鍵物件,就會返回對應的值物件,該介面描述了從不重複的鍵到值的對映。
Map的實現類通常在 java.util 程式包中實現,通常我們要例項化一個Map時,可以採取以下方式:
public static void main(String[] args) { ////Map基於散列表的實現。插入和查詢“鍵值對”的開銷是固定的。可以通過構造器設定容量capacity和負載因子load factor,以調整容器的效能。 Map map = new HashMap(); //類似於HashMap,但是迭代遍歷它時,取得“鍵值對”的順序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一點。而在迭代訪問時發而更快,因為它使用連結串列維護內部次序。 Map map2 = new LinkedHashMap(); //底層是二叉樹資料結構,執行緒不同步,可用於給Map集合中的鍵進行排序。 Map map3 = new TreeMap(); //Hashtable是執行緒安全的,它的方法都加了synchronized修飾符 Map map4 = new Hashtable(); //ConcurrentHashMap通常只被看做併發效率更高的Map,用來替換其他執行緒安全的Map容器,比如Hashtable和Collections.synchronizedMap。 Map map5 = new ConcurrentHashMap(); //還有其他的實現類...... }
而我們在日常中最多使用的實現類是HashMap,本文的DEMO也主要以HashMap來實現。
HashMap是最常用的Map類,是執行緒不同步的,它的底層資料結構是陣列+連結串列的形式,根據鍵的HashCode計算儲存位置,儲存鍵值對,可以根據鍵獲取對應值。具有很快的訪問速度,但是是無序的,允許key和value為null。鍵(key)必須是唯一,相同就覆蓋
新增元素:
public static void main(String[] args) { Map map = new HashMap(); map.put("hello", "world"); }
通過put方法新增元素,該方法第一個引數為鍵(key),第二個引數為值(value),如果有相同的鍵,新增的將覆蓋原來的。
當put時會先根據 key 的hashCode 重新計算 hash 值,根據 hash 值得到這個元素在陣列中的位置(即下標),如果陣列該位置上已經存放有其他元素了,那麼在這個位置上的元素將以連結串列的形式存放,新加入的放在鏈頭,最先加入的放在鏈尾。
如果陣列該位置上沒有元素,就直接將該元素放到此陣列中的該位置上。
獲取元素:
public static void main(String[] args) { Map map = new HashMap(); map.put("hello", "world"); map.get("hello"); }
通過get方法獲取元素,該方法通過鍵來獲取對應的值,如果key不存在將放回null。
與List集合一樣,Map集合也可以迴圈操作,而在日常程式設計中也經常需要對Map進行迴圈,這裡給出幾種常用的迴圈方式:
public static void main(String[] args) { Map map = new HashMap(); map.put("hello", "world"); map.put("hello2", "world2"); //遍歷map中的值 for (Object value : map.values()) { System.out.println("Value = " + value); } System.out.println("================分割線================"); //通過鍵找值遍歷 for (Object entry : map.keySet()) { System.out.println("Key = " + entry + ", Value = " + map.get(entry)); } System.out.println("================分割線================"); //使用迭代器 Iterator entries = map.entrySet().iterator(); while (entries.hasNext()) { Map.Entry entry = (Map.Entry) entries.next(); Object key = entry.getKey(); Object value = entry.getValue(); System.out.println("Key = " + key + ", Value = " + value); } }
HashMap的預設初始容量為16,負載因子為 0.75 的 HashMap,當然你也可以在new的時候自己指定初始容量。
總結:
簡單地說,HashMap 在底層將 key-value 當成一個整體進行處理,這個整體就是一個 Entry 物件。
HashMap 底層採用一個 Entry[] 陣列來儲存所有的 key-value 對,當需要儲存一個 Entry 物件時,會根據 hash 演算法來決定其在陣列中的儲存位置,在根據 equals方法決定其在該陣列位置上的連結串列中的儲存位置;當需要取出一個 Entry 時,也會根據 hash演算法找到其在陣列中的儲存位置,再根據 equals 方法從該位置上的連結串列中取出該 Entry。
常用方法:
put:新增元素
remove:刪除元素
size:返回集合長度
clear:刪除map中的所有鍵值對
isEmpty:判斷map是否為空
get:返回指定Key所對應的value,不存在則返回null
cotainsKey:判斷Map中是否包含指定的Key
containsValue:判斷Map中是否包含指定的Value
還有很多方法就不一 一列出來了,有興趣的同學可以去找API學習。
Map與List的區別:
List(列表):繼承Collection介面,以線性方式儲存,可以存放重複物件,有序,可重複
Map(鍵值對對映):把鍵物件和值物件對映的集合,它的每一個元素都包含一個鍵物件和值物件,無序,不可重複(重複的key將會覆蓋),允許null。
如果你覺得還不錯就分享出去!
當然你也可以關注公眾號第一時間接收!

1555737540494.jpg