1. 程式人生 > >JAVA高階基礎(11)---Map的常用方法及遍歷方式

JAVA高階基礎(11)---Map的常用方法及遍歷方式

Map

注:更多詳細方法請查詢 API

Map介面和Collection介面的不同

  1. Map是雙列的,Collection是單列的
  2. Map的鍵唯一,Collection的子體系Set是唯一的
  3. Map集合的資料結構值針對鍵有效,跟值無關;Collection集合的資料結構是針對元素有效

Map介面

Java為資料結構中定義了一個介面 java.util.Map ,此介面主要有四個常用的實現類,分別是 HashMap 、Hashtable 、 LinkedHashMap 、 TreeMap,繼承關係如下圖:

Map介面特點

  • Map 中存放置鍵值對,每一個元素都包含鍵物件和值物件
  • Map 中的 Key 不允許重複
  • Key 和 Value 之間存在單向一對一關係,即通過指定的 Key 總能找到唯一的,確定的 Value      

 

Map介面的使用

Map是無序 (存入和取出的順序)   

對於Map介面的遍歷

三種:

  1. 增強 for 迴圈
  2. 通過得到 KeySet 獲取每一個 key,再通過 key 去獲取值
  3. 通過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家族中一個普通成員,鑑於它可以滿足大多數場景的使用條件,所以是使用頻度最高的一個。