1. 程式人生 > 實用技巧 >Collection集合類

Collection集合類

單列集合類體系:

Collection是單列集合的根介面,有兩個重要的介面,分別是:

java.util.List:List介面的特點是元素有序,元素可重複

  • List介面的主要實現類是
  1. ArrayList:實現類,查詢快,增刪慢,底層是陣列
  2. LinkedList:實現類,查詢慢,增刪快,底層是集合

java.util.Set:Set介面的特點是元素不可重複,元素無索引

  • Set介面的主要實現類是
  1. HashSet:存取無序
  2. LingkedHashSet:存取有序
  3. TreeSet:對元素進行排序

Callection常用的功能:

因為它是所有集合的父類,所以它的方法所有集合都可以使用

  • boolean add(E e):把給定的物件新增到集合中
  • void clear():清空集合中所有的元素
  • boolean remove(E e):在集合中刪除指定的物件
  • boolean contains(Object obj):判斷給定的物件在不在集合中
  • boolean isEmpty():判斷當前集合是否為空
  • int size():返回集合中的元素個數
  • Object[ ] toArray():把集合中的元素,儲存到陣列中

iterator迭代器:(介面)

主要用於遍歷集合中的所有元素

迭代器的構造方法是泛型,所以所有的引用型別都可以使用

常用的方法有兩個:

  • boolean hasNext():如果下一個還有元素,那麼返回true
  • E next():返回迭代的下一個元素

使用方法:先進行hasNext()方法判斷下一個話有沒有元素,有的話就next()迭代

 // 獲取迭代器物件
        Iterator<String> it = col.iterator();

        // 迴圈判斷集合中是否有元素可以迭代
        while (it.hasNext()){
            // 說明有元素可以迭代
            String e = it.next();
            System.out.println(e);

注意:

  1. 如果集合中沒有元素可以迭代,那麼使用next()就會報錯
  2. 迭代完了還想迭代,那麼必須重新建立新的迭代器物件
  3. 在進行迭代的過程中,如果新增或則刪除元素,將無法繼續迭代
  4. 當迭代完一個元素,將這個元素通過迭代器物件名呼叫remove方法,就可以刪除該元素

增強for:

增強for迴圈是專門為了遍歷陣列和集合的,它的原理就是iterator迭代器

for(元素的資料型別  變數 : Collection集合or陣列){ 
      //寫操作程式碼
}

泛型:

在使用集合的時候不寫型別,那麼存的時候啥都能存,但取得時候啥也不是,這就很尷尬了

什麼時候使用泛型:如果一個類中,某個方法的引數型別或者返回值型別不確定的時候,可以把該方法定義為含有泛型的方法

所以我們在編譯階段直接對型別進行控制,定義儲存泛型的資料

修飾符 class 類名<代表泛型的變數> {  }
代表泛型的變數: 可以是任意字母  例如: T,E...

泛型是使用場景:

定義類:修飾符 class 類名<代表泛型的介面>{ }

定義方法:修飾符 <代表泛型的變數> 返回值型別 方法名(引數){ };

定義介面:修飾符 interface 介面名 <代表泛型的變數>{ };

  • 如果實現類還是不確定,那麼實現類也可以定義成泛型:
  • public class 實現類名<代表泛型的變數> implements 介面名<代表泛型的介面>{ };

泛型萬用字元:

在不知道使用什麼型別來接收的時候,可以使用?表示,這個時候只能接收資料,不可以往集合中儲存資料

受限泛型:

上限:型別名稱 <? extends 類> 物件名稱。只能接收該型別及其子類

下限:型別名稱 <? super 類> 物件名稱。只能接收該型別及其父類

List介面

特點:

  • 專門儲存有序的集合,比如說存的是1,2,3那麼在集合中儲存的順序也是1,2,3.
  • 它是一個有索引值的集合,通過索引就可以精確的找到要操作的元素
  • 可以儲存重複的元素

子類:

ArrayList集合:陣列結構儲存,日常開發中多用於查詢資料,遍歷資料。

LinkedList集合:連結串列結構儲存,方便元素tianjia、刪除的集合

- `public void addFirst(E e)`:將指定元素插入此列表的開頭。
- `public void addLast(E e)`:將指定元素新增到此列表的結尾。
- `public E getFirst()`:返回此列表的第一個元素。
- `public E getLast()`:返回此列表的最後一個元素。
- `public E removeFirst()`:移除並返回此列表的第一個元素。
- `public E removeLast()`:移除並返回此列表的最後一個元素。
- `public E pop()`:從此列表所表示的堆疊處彈出一個元素。
- `public void push(E e)`:將元素推入此列表所表示的堆疊。

Collections集合工具類的常用功能:

常用方法:

  • public static void shuffle(List<?> list):打亂集合順序
  • public static <T>void sort (List <T> list):將集合中的元素按照預設規則排序
  • public static <T> void sort(List <T> list,Comparator<? super T>):將集合中的元素按照指定的規則排序

public static <T>void sort (List <T> list):

當我們需要改變預設順序進行排序時,需要使用Comparator比較器:

  • 第一步:建立一個類去實現Comparator介面
  • 第二步:在該類中建立你要依據比較的成員變數(比如:年齡age)
  • 第三步:重寫compareTo方法(this表示前,引數表示後,前減後表示升序)
  • 第四步:在main方法中呼叫該類,建立集合物件,新增資料,呼叫sort方法

public static <T> void sort(List <T> list,Comparator<? super T>):

將集合中元素按照指定規則排序-->按照年齡升序排序

Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                // 指定排序規則
                // 前減後  升序
                // 後減前  降序
                // 前: 第一個引數o1  後:第二個引數o2
                return o2 - o1;
            }
        });

可變引數:

通過定義一個方法接收多個引數:引數的型別必須一致

格式:修飾符 返回值型別 方法名(引數型別。。。形參名){ }

需要注意的是:

  • 一個方法只能有一個可變引數
  • 如果方法中有多個闡述,可變引數要放在最後(因為系統會把引數從第一個位置開始放,如果第一個引數是可變的,那麼後面其它的引數都會放到第一個型別中)
 method3("itheima",10,20);


public static void method3(String  str,int... nums){

    }

在Collections中的應用場景:

// 往list集合中新增批量元素
        Collections.addAll(list,"2","A","K","Q","J","10","9","8","7","6","5","4","3");

Set介面:

特點:

  • 元素無索引,元素不可重複(唯一性)
  • HashSet集合:實現類--元素存取無序
  • LinkedHashSet集合:實現類--元素存取有序
  • TreeSet集合:--對元素進行排序

注意:

  • set集合沒有特殊的方法,都是使用Collection介面的方法
  • set集合沒有索引,只能通過增強for遍歷

Set的實現類:

HashSet:雜湊表儲存

使用雜湊表儲存保證了元素的唯一性

HashSet的使用方法和Collection基本相同

使用HashSet集合儲存自定義元素:

給HashSet中存放自定義型別元素時,需要重寫物件中的hashCode和equals方法,建立自己比較的方式,才能保證集合物件的唯一性。

  • 在自定義的類中重寫hashCode和equals方法
  • 這樣就不會因為集合的地址不一樣而使得相同的資料被傳入進HashSet中

LinkHashSet:雜湊表加連結串列儲存

LinkHashSet實現類和HashSet的區別在於底層增加了連結串列,這樣使得LinkHashSet擁有了有序的屬性(是儲存有序,但是還是沒有索引值,元素不可重複)

TreeSet集合:紅黑樹

特點:元素唯一,沒有索引,使用元素的自然順序進行排序,或者根據TreeSet提供的Comparator比較器進行排序

 TreeSet<Integer> set2 = new TreeSet<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                /*
                    指定排序規則:
                    前減後  升序
                    後減前  降序
                    前:第一個引數  後:第二個引數
                 */
                return o1 - o2;
            }
        });

Map集合:

特點:

  • Map集合定義的是雙列集合的規範
  • Map集合儲存元素是以鍵值對的形式儲存的,每一個鍵值對都有鍵和值
  • Map集合的鍵是唯一的,值是可以重複的,但是如果鍵重複就會被覆蓋(班和任課老師)
  • 根據鍵取值

Map的常用方法:

  • public V put(K key, V value): 把指定的鍵與指定的值新增到Map集合中。

  • public V remove(Object key): 把指定的鍵 所對應的鍵值對元素 在Map集合中刪除,返回被刪除元素的值。

  • public V get(Object key) 根據指定的鍵,在Map集合中獲取對應的值。

  • public boolean containsKey(Object key):判斷該集合中是否有此鍵

  • public Set<K> keySet(): 獲取Map集合中所有的鍵,儲存到Set集合中。

  • public Set<Map.Entry<K,V>> entrySet(): 獲取到Map集合中所有的鍵值對物件的集合(Set集合)。

通過鍵找值:先使用KeySet方法找到所有鍵,再通過get方法找到值

鍵值對找鍵,值:通過entrySet方法找到所有鍵值對,再通過getKey和getValue方法分別找到鍵和值

HashMap集合:(陣列+單行連結串列/紅黑樹)

HashMap:儲存無序,不能儲存重複值(使用的時候要重寫hasCode和equals方法)

LinkHashMap集合:(雜湊表+連結串列)

相比HashMap底層多了連結串列結構,使得它儲存有序

TreeMep集合:(紅黑樹)

同樣可以使用自然排序和比較器排序