天天看點

黑馬程式員----集合類

----------Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流!------------

集合類

Java語言的Java.util包提供了一些集合類,集合類中的繼承關系圖如下

黑馬程式員----集合類

1、 特點:

  1.對象封裝資料,對象多了也需要存儲。集合用于存儲對象。

   2.對象的個數确定可以使用數組,但是不确定怎麼辦?可以用集合。因為集合是可變長度的。

2、 集合和數組的差別:

   1、數組是固定長度的;集合可變長度的。

   2、數組可以存儲基本資料類型,也可以存儲引用資料類型;集合隻能存儲引用資料類型。

   3、數組存儲的元素必須是同一個資料類型;集合存儲的對象可以是不同資料類型。

集合類中的接口

 一、Collection接口:

    1.List:有序(元素存入集合的順序和取出的順序一緻),元素都有索引。元素可以重複。

    2.Set:無序(存入和取出順序有可能不一緻),不可以存儲重複元素。必須保證元素唯一性。

1.Collection定義了集合架構的共性功能

  1.添加

    add(e);

    addAll(collection);

  2.删除

    remove(e);

    removeAll(collection);

    clear();

  3.判斷。

    contains(e);

    isEmpty();

  4.擷取

    iterator();

    size();

  5.擷取交集。

    retainAll();

  6.集合變數組。

    toArray();

2、Liset接口:

 List本身是Collection接口的子接口,具備了Collection的所有方法。

    List:有序(元素存入集合的順序和取出的順序一緻),元素都有索引。元素可以重複。list的子類如下:

         1.ArrayList:底層的資料結構是數組,線程不同步,ArrayList替代了Vector,查詢元素的速度非常快。

         2.LinkedList:底層的資料結構是連結清單,線程不同步,增删元素的速度非常快。

         3.Vector:底層的資料結構就是數組,線程同步的,Vector無論查詢和增删都巨慢。

list中的共性方法

  1.添加:

     add(index,element) :在指定的索引位插入元素。

     addAll(index,collection) :在指定的索引位插入一堆元素。

  2.删除:

    remove(index) :删除指定索引位的元素。 傳回被删的元素。

  3.擷取:

    get(int index) :通過索引擷取指定元素。

     int indexOf(obj) :擷取指定元素第一次出現的索引位,如果該元素不存在傳回-1; 

     是以,通過-1,可以判斷一個元素是否存在。

    int lastIndexOf(Object o) :反向索引指定元素的位置。

    List subList(start,end) :擷取子清單。

  4.修改:

    set(index,element) :對指定索引位進行元素的修改。

  5.擷取所有元素:

    ListIterator listIterator():list集合特有的疊代器。

    List集合支援對元素的增、删、改、查。

3.Set接口:

  Set接口中的方法和Collection中方法一緻的。

      1、HashSet:底層資料結構是哈希表,線程是不同步的。無序,高效;

          HashSet集合保證元素唯一性:通過元素的hashCode方法,和equals方法完成的。

          當元素的hashCode值相同時,才繼續判斷元素的equals是否為true。

          如果為true,那麼視為相同元素,不存。如果為false,那麼存儲。

          如果hashCode值不同,那麼不判斷equals,進而提高對象比較的速度。     

      2、LinkedHashSet:有序,hashset的子類。

      3、TreeSet:對Set集合中的元素的進行指定順序的排序。不同步。TreeSet底層的資料結構就是二叉樹

對于ArrayList集合,判斷元素是否存在,或者删元素底層依據都是equals方法。

對于HashSet集合,判斷元素是否存在,或者删除元素,底層依據的是hashCode方法和equals方法。

TreeSet:

    用于對Set集合進行元素的指定順序排序,排序需要依據元素自身具備的比較性。

    如果元素不具備比較性,在運作時會發生ClassCastException異常。

    是以需要元素實作Comparable接口,強制讓元素具備比較性,複寫compareTo方法。

    依據compareTo方法的傳回值,确定元素在TreeSet資料結構中的位置。

    TreeSet方法保證元素唯一性的方式:就是參考比較方法的結果是否為0,如果return 0,視為兩個對象重複,不存。

   TreeSet集合排序有兩種方式,Comparable和Comparator差別:

    1:讓元素自身具備比較性,需要元素對象實作Comparable接口,覆寫compareTo方法。

    2:讓集合自身具備比較性,需要定義一個實作了Comparator接口的比較器,并覆寫compare方法,并将該類對象作為實際參數傳遞給TreeSet集合的構造函數。

二、Map集合接口

     1、HashMap:底層是哈希表資料結構,是線程不同步的。可以存儲null鍵,null值。替代了Hashtable.

     2、TreeMap:底層是二叉樹結構,可以對map集合中的鍵進行指定順序的排序。

1、map中的共性方法

  1.添加

    put(key,value):當存儲的鍵相同時,新的值會替換老的值,并将老值傳回。如果鍵沒有重複,傳回null。 void putAll(Map);

  2.删除。

   void clear():清空

   value remove(key) :删除指定鍵

   3.判斷。

    boolean isEmpty():

    boolean containsKey(key):是否包含key

    boolean containsValue(value) :是否包含value

  4.取出。

    int size():傳回長度 value get(key) :通過指定鍵擷取對應的值。如果傳回null,可以判斷該鍵不存在。當然有特殊情況,就是在hashmap集合中,是可以存儲null鍵null值的

    Collection values():擷取map集合中的所有的值。

 5.想要擷取map中的所有元素:

      原理:map中是沒有疊代器的,collection具備疊代器,隻要将map集合轉成Set集合,可以使用疊代器了。之是以轉成set,是因為map集合具備着鍵的唯一性,其實set集合 就來自于map,set集合底層其實用的就是map的方法。

2、把map集合轉成set的方法:

1.Set keySet();

2.Set entrySet();//取的是鍵和值的映射關系。

3、取出Map中元素的方式

  1.方式一:keySet()方法。

   可以将map集合中的鍵都取出存放到set集合中。對set集合進行疊代。疊代完成,再通過get方法對擷取到的鍵進行值的擷取。

    Set keySet = map.keySet();

     Iterator it = keySet.iterator();

      while(it.hasNext()) {

         Object key = it.next();

        Object value = map.get(key);

        System.out.println(key+":"+value);

}

--------------------------------------------------------

  2.方式二:entrySet()方法。

       Set entrySet = map.entrySet();

         Iterator it = entrySet.iterator();

           while(it.hasNext()) {

             Map.Entry  me = (Map.Entry)it.next();

             System.out.println(me.getKey()+"::::"+me.getValue());

}

4、比較的兩種方式:

一個是Comparable:覆寫compareTo方法;

一個是Comparator:覆寫compare方法。

集合類接口的實作類

1、List接口實作類

在項目中建立Gather類,在主方法中建立集合對象,通過Math類的random()方法随機擷取集合中的某個元素,然後一出數組中索引為2的元素,最後周遊數組

import java.util.*;
public class Gather { // 建立類Gather
    public static void main(String[] args) { // 主方法
        List<String> list = new ArrayList<>(); // 建立集合對象
        list.add("a"); // 向集合添加元素
        list.add("b");
        list.add("c");
        int i = (int) (Math.random() * (list.size() - 1)); // 獲得0~1之間的随機數
        System.out.println("随機擷取數組中的元素:" + list.get(i));
        list.remove(2); // 将指定索引位置的元素從集合中移除
        System.out.println("将索引是'2'的元素從數組移除後,數組中的元素是:");
        for (int j = 0; j < list.size(); j++) { // 循環周遊集合
            System.out.println(list.get(j));
        }
    }
}
           

2、Map接口實作類

通過HashMap類執行個體化Map集合,并周遊該Map集合,然後建立TreeMap執行個體實作将集合中的元素順序輸出

1.首先建立Emp類

public class Emp {
	private String e_id;
	private String e_name;
	public Emp( String e_id,String e_name) {
		this.e_id = e_id;
		this.e_name = e_name;
	}
	public String getE_id() {
		return e_id;
	}
	public void setE_id(String e_id) {
		this.e_id = e_id;
	}
	public String getE_name() {
		return e_name;
	}
	public void setE_name(String e_name) {
		this.e_name = e_name;
	}
	
           

2.建立一個用于廁所的主類

import java.util.*;
public class MapText { // 建立類MapText
	public static void main(String[] args) { // 主方法
		Map<String,String> map = new HashMap<>(); // 由HashMap實作的Map對象
		Emp emp = new Emp("001", "張三");
		Emp emp2 = new Emp("005", "李四"); // 建立Emp對象
		Emp emp3 = new Emp("004", "王一");
		map.put(emp.getE_id(), emp.getE_name());
		map.put(emp2.getE_id(), emp2.getE_name()); // 将對象添加到集合中
		map.put(emp3.getE_id(), emp3.getE_name());
		Set<String> set = map.keySet(); // 擷取Map集合中的key對象集合
		Iterator<String> it = set.iterator();
		System.out.println("HashMap類實作的Map集合,無序:");
		while (it.hasNext()) {
			String str = (String) it.next();
			String name = (String) map.get(str); // 周遊Map集合
			System.out.println(str + " " + name);
		}
		TreeMap<String,String> treemap = new TreeMap<>(); // 建立TreeMap集合對象
		treemap.putAll(map); // 向集合添加對象
		Iterator<String> iter = treemap.keySet().iterator();
		System.out.println("TreeMap類實作的Map集合,鍵對象升序:");
		while (iter.hasNext()) { // 周遊TreeMap集合對象
			String str = (String) iter.next(); // 擷取集合中的所有key對象
			String name = (String) treemap.get(str); // 擷取集合中的所有values值
			System.out.println(str + " " + name);
		}
	}
}