詳解Map集合體系及方法entrySet、keySet、values


簡單回顧Map集合:

 

Map表示映射關系,以鍵值對的方式來保存數據。key和value一一對應。key是唯一的,不可重復,而value是可重復的,可以被多個key關聯。雖然Map是放入兩個數據,但是卻以key作為操作對象,value只是作為key的關聯值。

通過查看,會發現Set與Map的實現類很相似,Set實現類的底層操作就是用Map來實現的,Set集的特性就來自於Map。唯一不同的就是Map表示一種映射關系,一次存儲2個數據,Set只能存儲單一數據。

Map體系中的主要類:

  • HashMap:Map的典型實現,元素是無序且不可重復,這里的元素指的是key。
  • LinkedHashMap:以插入的次序作為排序狀態,其他的和HashMap一致。
  • TreeMap:元素處於排序狀態,可以使用自然排序也可以使用自定義排序,但key的類型必須一致,不然無法進行比較。
  • Properties:Key-Value都是String類型,用於加載屬性文件。后續會說到。

Map的重要方法和特點:

常用方法就不概述,關於Map中方法的使用細節,例如replace()和remove()方法,如果返回值是Object,則會返回以前的value,返回值boolean,代表是否執行成功。重點需要了解entrySet()、keySet() 和values()的使用。
  • entrySet()___返回一個包含所有映射關系的Set集合,該Set集合的類型為Map.Entry,一般用於迭代鍵值對。Map.Entry是一個內部接口。
  • keySet()__..._返回該映射中所有key組成的Set集合。通過key獲取鍵值對。
  • values()___._返回該映射中所有value值。
  • 這三個方法主要用於遍歷鍵值對或直接獲取value值,非常方便。但使用返回對象的方法時,會引發錯誤。代碼示例和解析在最下面。

HashMap的代碼示例

		HashMap hm = new HashMap();
		//放入鍵值對
		hm.put("cn", "中國");
		hm.put(1, 100);		
		hm.put("us", "美國");
		hm.put("Ja", "日本");
		hm.put("時間", new Date());
		hm.put(1, 200);//用同一個key關聯別的value
		System.out.println(hm);	//等同於hm.toString()
		
		System.out.println("----根據key獲取關聯的值------");
		System.out.println(hm.get("Ja"));
		System.out.println(hm.get(1));
			
		System.out.println("----替換指定的鍵值對-------");
		System.out.println(hm.replace(1, "100"));//返回被替換的value
		System.out.println(hm.replace("us", "美國","FuckYou"));//返回boolean,表示是否替換成功
		
		System.out.println("----刪除指定鍵值對----");
		System.out.println(hm.remove("Ja"));//返回被刪除的value
		System.out.println(hm.remove("Ja","日本"));//返回是否成功刪除
典型的Map實現,查看打印結果:元素是無序且不可重復的。在代碼中放入兩個相同的鍵值對,key只能有一個,如果value也不同,后來添加的value會覆蓋原來的value。
 

LinkedHashMap簡單示例

		LinkedHashMap lhm = new LinkedHashMap();
		lhm.put(1,"B");
		lhm.put(4,"A");
		lhm.put(3,"C");
		lhm.put(2,"D");
		System.out.println(lhm);
		//輸出:{1=B, 4=A, 3=C, 2=D}
LinkedHashMap就是以插入次序作為排序狀態,別的和HashMap一致。非常類似於HashSet與LinkedHashSet的關系。
 

entrySet() 和 keySet() 和 values()的代碼示例

以TreeMap為例,演示entrySet()

		TreeMap tm = new TreeMap();	
		tm.put(1, "壹");		
		tm.put(3, "叄");
		tm.put(6, "陸");
		tm.put(7, "柒");
		
		//使用迭代器來遍歷元素
		Set entrys = tm.entrySet();
		Iterator it = entrys.iterator();
		while(it.hasNext()) {
			Map.Entry entry = (Map.Entry)it.next();//轉換成Map.Entry類型
			System.out.println(entry.getKey() +"-" + entry.getValue());			
		}

以TreeMap為例,演示keySet()

		TreeMap tm = new TreeMap();	
		tm.put(1, "壹");		
		tm.put(3, "叄");
		tm.put(6, "陸");
		tm.put(7, "柒");
		
		Set k = tm.keySet();
		Iterator it = k.iterator();
		//mode 1
		while(it.hasNext()) {
			Object key = it.next();//獲取key
			System.out.println(key + "->" + tm.get(key));
		}
		//mode 2
		for(Object key : k) {
			System.out.println(key +"->" + tm.get(key));
		}

以TreeMap為例,演示values()

		TreeMap tm = new TreeMap();	
		tm.put(1, "壹");		
		tm.put(3, "叄");
		tm.put(6, "陸");
		tm.put(7, "柒");
		Collection value = tm.values();	
		for(Object v : value) {
			System.out.println(v);
		}
 

entrySet() keySet() 和 values()返回對象中的操作方法

		TreeMap tm = new TreeMap();	
		tm.put(1, "壹");		
		tm.put(3, "叄");
		tm.put(6, "陸");
		tm.put(7, "柒");
		Set entry = tm.entrySet();	
		Set key = tm.keySet();
		Collection value = tm.values();		

//		entry.add("A");引發不支持的操作異常
		System.out.println(entry.remove(1));//false
		System.out.println(entry.contains(3));//false
		
		System.out.println(key.remove(1));//true
		System.out.println(key.contains(3));//true
		
		System.out.println(value.remove("壹"));//false
上面代碼中,可以看出無論是返回Set對象還是Collection,添加元素都會引發不支持的操作異常。這是因為返回的集合對象本質上依然是對鍵值對操作。它們的不同之處:
entrySet()中有key和value,所以直接加入元素或者刪除元素的方法都是無效的。keySet()中有key,可以對key進行操作,所以能使用remove()和equals(),所以返回true。
values()中只有value值,沒有key,value值是沒什么用的,所以values()方法也僅僅是獲取所有value值方便。
相同之處:
方法中如果沒有參數,不涉及到對鍵值對進行的操作,都是可以使用的。例如Iterator()、clear()、size()和isEmpty()等。
 

entrySet() 和 keySet() 和 values()的使用總結:

  • 一般只使用它們的迭代器,用於獲取所有鍵值對。
  • 除了迭代器,對元素進行操作的方法不建議使用,容易出錯。
  • 如果要高效遍歷key-value,建議使用entrySet(),keySet()也可以做到,但需要通過key來獲取value,多增加了一步。
  • 獲取所有key就使用keySet(),獲取所有value就使用values()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM