JAVA高階基礎(11)---Map的常用方法及遍歷方式
Map
注:更多詳細方法請查詢 API
Map介面和Collection介面的不同
- Map是雙列的,Collection是單列的
- Map的鍵唯一,Collection的子體系Set是唯一的
- Map集合的資料結構值針對鍵有效,跟值無關;Collection集合的資料結構是針對元素有效
Map介面
Java為資料結構中定義了一個介面 java.util.Map ,此介面主要有四個常用的實現類,分別是 HashMap 、Hashtable 、 LinkedHashMap 、 TreeMap,繼承關係如下圖:
Map介面特點
- Map 中存放置鍵值對,每一個元素都包含鍵物件和值物件
- Map 中的 Key 不允許重複
- Key 和 Value 之間存在單向一對一關係,即通過指定的 Key 總能找到唯一的,確定的 Value
Map介面的使用
Map是無序 (存入和取出的順序)
對於Map介面的遍歷
三種:
- 增強 for 迴圈
- 通過得到 KeySet 獲取每一個 key,再通過 key 去獲取值
- 通過entrySet 得到的是一個Set集合 set集合中的每一個元素都是 Map.Entry 型別
package org.lanqiao.map.demo; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; public class MapDemo { public static void main(String[] args) { //1 建立一個map物件 Map map = new HashMap() ; //2 map存入資料 map.put(1, "aa"); map.put(3, "cc"); map.put(4, "dd"); map.put("李四",18); map.put(2, "bb"); map.put(5, "ff"); map.put(5, "mm"); map.put(null, null); map.put("zhangsan", 22); // 獲取鍵值對的set集合 Set set = map.entrySet(); //3 遍歷map for(Object m : set) { System.out.println(m); } System.out.println("-----------------------"); //獲取鍵的set集合 Set setKey = map.keySet(); //Object value = map.get(5); //System.out.println(value); for(Object o : setKey) { System.out.println(o +"="+ map.get(o)); } System.out.println("-----------------------"); //判斷方法 boolean oKey = map.containsKey(3); System.out.println(oKey); boolean containsV = map.containsValue("mm"); System.out.println(containsV); System.out.println(map.size()); System.out.println("-----------------------"); //values() Collection c = map.values(); Iterator iter = c.iterator(); while(iter.hasNext()) { System.out.println(iter.next()); } /*System.out.println("--------不能使用List接收---------------"); List list = (List) map.values(); for(Object o : list) { System.out.println(o); }*/ System.out.println("-------- entrySet---------------"); Set s1 = map.entrySet(); /*Map.Entry me = (Map.Entry)s1; Object v = me.getValue(); Object k = me.getKey(); System.out.println(k+"---"+v);*/ for(Object s : s1) { // System.out.println(s instanceof Map.Entry); Map.Entry me = (Map.Entry)s; Object v = me.getValue(); Object k = me.getKey(); System.out.println(k+"---"+v); } } }
package org.lanqiao.map.demo; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.lanqiao.setDemo.Student; public class MapDemo2 { public static void main(String[] args) { Student stu1 = new Student("張三",21); Student stu2 = new Student("李四",18); Student stu3 = new Student("王五",22); Student stu4 = new Student("趙六",18); Map map = new HashMap(); map.put(1, stu1); map.put(2, stu2); map.put(3, stu3); map.put(4, stu4); map.put(4, stu2); //通過獲取健集(keySet) Set keySet = map.keySet(); for(Object obj :keySet) { System.out.println(map.get(obj)); } Iterator iter = keySet.iterator(); while(iter.hasNext()) { Object obj = iter.next(); System.out.println(map.get(obj)); } //通過獲取entrySet(鍵值對的集合) Set s1 = map.entrySet(); Iterator ite = s1.iterator(); while(ite.hasNext()) { Object obj = ite.next(); Map.Entry me = (Map.Entry)obj; System.out.println(me.getKey()+"---"+me.getValue()); } } }
下面針對各個實現類的特點做一些說明
(1) HashMap
它根據鍵的 hashCode 值儲存資料,大多數情況下可以直接定位到它的值,因而具有很快的訪問速度,但遍歷順序卻是不確定的
HashMap最多只允許一條記錄的鍵為null,允許多條記錄的值為null。HashMap非執行緒安全,即任一時刻可以有多個執行緒同時
HashMap,可能會導致資料的不一致。如果需要滿足執行緒安全,可以用 Collections 的 synchronizedMap 方法使 HashMap 具有執行緒安全的能力,或者使用 ConcurrentHashMap。
基於Map 介面的實現類:允許使用 null 值和 null 鍵;此類不保證對映的順序;在多執行緒操作下不安全
(2) Hashtable
Hashtable 是遺留類,很多對映的常用功能與 HashMap 類似,不同的是它繼承自 Dictionary 類,並且是執行緒安全的,任一時間只有一個執行緒能寫 Hashtable,併發性不如 ConcurrentHashMap,因為 ConcurrentHashMap 引入了分段鎖。Hashtable 不建議在新程式碼中使用,不需要執行緒安全的場合可以用 HashMap 替換,需要執行緒安全的場合可以用 ConcurrentHashMap 替換。
(3) LinkedHashMap
LinkedHashMap 是 HashMap 的一個子類,儲存了記錄的插入順序,在用 Iterator 遍歷 LinkedHashMap 時,先得到的記錄肯定是先插入的,也可以在構造時帶引數,按照訪問次序排序。
基於雜湊表和連結串列的實現類,具有可預知的迭代順序(雙重連結表的有序性)
(4) TreeMap
TreeMap 實現 SortedMap 介面,能夠把它儲存的記錄根據鍵排序,預設是按鍵值的升序排序,也可以指定排序的比較器,當用Iterator 遍歷 TreeMap 時,得到的記錄是排過序的。如果使用排序的對映,建議使用 TreeMap 。在使用 TreeMap 時,key 必須實現Comparable 介面或者在構造 TreeMap 傳入自定義的 Comparator,否則會在執行時丟擲 java.lang.ClassCastException 型別的異常
對於上述四種Map型別的類,要求對映中的 key 是不可變物件。不可變物件是該物件在建立後它的雜湊值不會被改變。如果物件的雜湊值發生變化,Map物件很可能就定位不到對映的位置了。
通過上面的比較,我們知道了HashMap是Java的Map家族中一個普通成員,鑑於它可以滿足大多數場景的使用條件,所以是使用頻度最高的一個。