List Set Map 集合精講

      介紹集合之前,先扯一下數組Array和集合的區別:

數組是大小固定的,並且同一個數組只能存放類型一樣的數據。(基本類型/引用類型)。
集合可以存儲、操作數目不固定的一組數據。
若程序有時不知道究竟需要多少對象,需要在空間不足時自動擴增容量,則需要使用容器類庫,array不適用。
二者使用相應的toArray()和Arrays.asList()方法可以相互轉換。

一、什麼是集合?集合有哪些

  • 集合類存放於java.util包中。
  • 集合類存放的都是對象的引用,而非對象本身,出於表達上的便利,我們稱集合中的對象就是指集合中對象的引用(reference)。
  • 集合類型主要有3種:set、list、map。

二、粗談Set  List Map的區別(面試有時會問到)

  • ListSet是存儲單列數據的集合Map是存儲鍵值對這樣的雙列數據的集合
  • List中存儲的數據是有順序的,並且值允許重複
  • Map中存儲的數據是無序的,它的鍵是不允許重複的,但是值是允許重複的。
  • Set中存儲的數據是無順序的,並且不允許重複,但元素在集合中的位置是由元素的hashcode決定,即位置是固定的(Set集合是根據hashcode來進行數據存儲的,所以位置是固定的,但是這個位置不是用戶可以控制的,所以對於用戶來說set中的元素還是無序的)。

、集合的構成

  • List , Set, Map都是接口,前兩個繼承至Collection接口,Map爲獨立接口
  1. List 接口有三個實現類

             1.1.LinkedList  (基於鏈表實現,鏈表內存是散列的,增刪快,查找慢)

             1.2.ArrayList    (基於數組實現,非線程安全,效率高,增刪慢,查找快)

             1.3.Vector          (基於數組實現,線程安全,效率低,增刪慢,查找慢)

    2. Map 接口有四個實現類

             2.1.HashMap     (基於 hash 表的 Map 接口實現,非線程安全,高效,支持 null 值和 null鍵)

             2.2.HashTable    (線程安全,低效,不支持 null 值和 null 鍵)

             2.3.LinkedHashMap (是 HashMap 的一個子類,保存了記錄的插入順序)

             2.4.SortMap 接口        (TreeMap,能夠把它保存的記錄根據鍵排序,默認是鍵值的升序排序)   

    3. Set接口有兩個實現類

             3.1.HashSet            (底層是由 Hash Map 實現,不允許集合中有重複的值,使用該方式時需要重寫 equals()和 hash Code()方法)

             3.2.LinkedHashSet   (繼承於 HashSet,同時又基於 LinkedHashMap 來進行實現,底層使用的是 LinkedHashMap)

  • Collection接口下還有個Queue接口,有PriorityQueue類

這裏寫圖片描述

 補充:HashMap 和 HashTable

HashMap 是線程不安全的,HashMap 是一個接口,是 Map的一個子接口,是將鍵映射到值得對象,不允許鍵值重複,允許空鍵和空值;由於非線程安全, HashMap的效率要較 HashTable 的效率高一些.
HashTable
是線程安全的一個集合,不允許 null 值作爲一個 key 值或者 Value 值;
HashTable 是 sychronize(同步化),多個線程訪問時不需要自己爲它的方法實現同步,而 HashMap 在被多個線程訪問的時候需要自己爲它的方法實現同步;


四、集合的用法

  •     List
    // 申明一個list,Object:指List裏的值是什麼類型的,Object代表可以是任何形式的
	    List<Object> list = new ArrayList<Object>();
    

    // add() 集合裏添加數據
    	list.add("張三");
		list.add("李四");
		list.add("王五");

     
   // 拿數據 get()
        list.get(0)  結果:張三



   // 集合大小(集合裏數據個數),size()
        list.size()



    //list 遍歷
		for(int i=0;i<list.size();i++){
			System.out.println(list.get(i));
		}


  // 注意:list取值是通過下標,是從0開始的
  • map
// 聲明一個map
//說明:Map是通過key-value(值鍵對) ,String代表key的類型(一般都是String),Object代表value的類型
      Map<String,Object> map = new HashMap<String,Object>();




// 賦值 put(key,value)
	   map.put("name", "小明");
	   map.put("sex", "男");
	   map.put("age", 18);


// 取值  get(key)
      map.get("name")    結果:小明
  • List<map>
// 聲明一個list<Map>
        List<Map<String,Object>> listMap = new ArrayList<Map<String,Object>>();



// 賦值 先給map賦值,然後把map添加到list中
		Map<String,Object> map1 = new HashMap<String,Object>();
		map1.put("name", "小明");
		map1.put("sex", "男");
		map1.put("age", 18);

		Map<String,Object> map2 = new HashMap<String,Object>();
		map2.put("name", "小紅");
		map2.put("sex", "女");
		map2.put("age", 16);

		listMap.add(map1);
		listMap.add(map2);

		結果:[{sex=男, name=小明, age=18}, {sex=女, name=小紅, age=16}]



// 遍歷
		for(int i = 0;i<listMap.size();i++){
			System.out.print(listMap.get(i).get("name"));
			System.out.print(listMap.get(i).get("sex"));
			System.out.print(listMap.get(i).get("age"));
			System.out.println();
		}

 

        

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章