1. 程式人生 > >java----day20(集合框架)

java----day20(集合框架)

Map介面

Map介面下的集合與Collection介面下的集合,它們儲存資料的形式不同,如下圖。

  1. Collection中的集合,元素是孤立存在的(理解為單身),向集合中儲存元素採用一個個元素的方式儲存。
  2. Map中的集合,元素是成對存在的(理解為夫妻)。每個元素由鍵與值兩部分組成,通過鍵可以找對所對應的值。
  3. Collection中的集合稱為單列集合,Map中的集合稱為雙列集合。
  4. 需要注意的是,Map中的集合不能包含重複的鍵,值可以重複;每個鍵只能對應一個值。
  5. Map中常用的集合為HashMap集合、LinkedHashMap集合。

Map介面中常用集合概述

  • HashMap<K,V>:儲存資料採用的雜湊表結構,元素的存取順序不能保證一致。由於要保證鍵的唯一、不重複,需要重寫鍵的hashCode()方法、equals()方法。
  • LinkedHashMap<K,V>:HashMap下有個子類LinkedHashMap,儲存資料採用的雜湊表結構+連結串列結構。通過連結串列結構可以保證元素的存取順序一致;通過雜湊表結構可以保證的鍵的唯一、不重複,需要重寫鍵的hashCode()方法、equals()方法。
  • 注意:Map介面中的集合都有兩個泛型變數<K,V>,在使用時,要為兩個泛型變數賦予資料型別。兩個泛型變數<K,V>的資料型別可以相同,也可以不同。

Map介面中的常用方法

程式碼演示

public class MapDemo {
	public static void main(String[] args) {
		//建立Map物件
		Map<String, String> map = new HashMap<String,String>();
		//給map中新增元素
		map.put("星期一", "Monday");
		map.put("星期日", "Sunday");
		System.out.println(map); // {星期日=Sunday, 星期一=Monday} 

		//當給Map中新增元素,會返回key對應的原來的value值,若key沒有對應的值,返回null
		System.out.println(map.put("星期一", "Mon")); // Monday
		System.out.println(map); // {星期日=Sunday, 星期一=Mon}

		//根據指定的key獲取對應的value
		String en = map.get("星期日");
		System.out.println(en); // Sunday
		
		//根據key刪除元素,會返回key對應的value值
		String value = map.remove("星期日");
		System.out.println(value); // Sunday
		System.out.println(map); // {星期一=Mon}
	}
}

 

Map集合遍歷鍵找值方式

操作步驟與圖解:        

1.獲取Map集合中所有的鍵,由於鍵是唯一的,所以返回一個Set集合儲存所有的鍵

2.遍歷鍵的Set集合,得到每一個鍵

3.根據鍵,獲取鍵所對應的值

Entry鍵值對物件

在Map類設計時,提供了一個巢狀介面:Entry。Entry將鍵值對的對應關係封裝成了物件。即鍵值對物件,這樣我們在遍歷Map集合時,就可以從每一個鍵值對(Entry)物件中獲取對應的鍵與對應的值。

  • Entry是Map介面中提供的一個靜態內部巢狀介面。

Map集合遍歷鍵值對方式

1.獲取Map集合中,所有的鍵值對(Entry)物件,以Set集合形式返回。

        

2.遍歷包含鍵值對(Entry)物件的Set集合,得到每一個鍵值對(Entry)物件

3.通過鍵值對(Entry)物件,獲取Entry物件中的鍵與值。

        

靜態匯入

靜態匯入格式:

import static XXX.YYY;   匯入後YYY可直接使用。

可變引數

修飾符 返回值型別 方法名(引數型別... 形參名){  }

其實這個書寫完全等價與

修飾符 返回值型別 方法名(引數型別[] 形參名){  }

只是後面這種定義,在呼叫時必須傳遞陣列,而前者可以直接傳遞資料即可。

	public static void main(String[] args) {
		int[] arr = {21,89,32};
		int sum = add(arr);
		System.out.println(sum);
		sum = add(21,89,32);//可變引數呼叫形式
		System.out.println(sum);
		
	}

	//JDK1.5之後寫法
	public static int add(int...arr){
		int sum = 0;
		for (int i = 0; i < arr.length; i++) {
			sum += arr[i];
		}
		return sum;
	}
  • 上述add方法在同一個類中,只能存在一個。因為會發生呼叫的不確定性

注意:如果在方法書寫時,這個方法擁有多引數,引數中包含可變引數,可變引數一定要寫在引數列表的末尾位置。

Collections集合工具類

  • public static <T> void sort(List<T> list) // 集合元素排序

//排序前元素list集合元素 [33,11,77,55]

Collections.sort( list );

//排序後元素list集合元素 [11,33,55,77]

  • public static void shuffle(List<?> list) //  集合元素儲存位置打亂

//list集合元素 [11,33,55,77]

Collections.shuffle( list );

//使用shuffle方法後,集合中的元素為[77,33,11,55],每次執行該方法,集合中儲存的元素位置都會隨機打亂

集合巢狀

  • ArrayList巢狀 ArrayList

    ArrayList< ArrayList<String> >

    Collection< ArrayList<Integer> >

  • Map巢狀 ArrayList

HashMap<String, ArrayList<Person>>

ArrayList< HashMap<String, String>>

  • Map集合巢狀

HashMap<String, HashMap<String,String>>

HashMap<String, HashMap<Person,String>>

集合繼承體系的面向物件思想

  1. 介面:用來明確所有集合中該具有的功能,相當於在定義集合功能標準;
  2. 抽象類:把多個集合中功能實現方式相同的方法,抽取到抽象類實現,具體集合不再遍寫,繼承使用即可;
  3. 具體類:繼承抽象類,實現介面,重寫所有抽象方法,達到具備指定功能的集合。每個具體集合類,根據自身的資料儲存結構方式,對介面中的功能方法,進行不同方式的實現。