Collection集合類
單列集合類體系:
Collection是單列集合的根介面,有兩個重要的介面,分別是:
java.util.List:List介面的特點是元素有序,元素可重複
- List介面的主要實現類是
- ArrayList:實現類,查詢快,增刪慢,底層是陣列
- LinkedList:實現類,查詢慢,增刪快,底層是集合
java.util.Set:Set介面的特點是元素不可重複,元素無索引
- Set介面的主要實現類是
- HashSet:存取無序
- LingkedHashSet:存取有序
- 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);
注意:
- 如果集合中沒有元素可以迭代,那麼使用next()就會報錯
- 迭代完了還想迭代,那麼必須重新建立新的迭代器物件
- 在進行迭代的過程中,如果新增或則刪除元素,將無法繼續迭代
- 當迭代完一個元素,將這個元素通過迭代器物件名呼叫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 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()
通過鍵找值:先使用KeySet方法找到所有鍵,再通過get方法找到值
鍵值對找鍵,值:通過entrySet方法找到所有鍵值對,再通過getKey和getValue方法分別找到鍵和值
HashMap集合:(陣列+單行連結串列/紅黑樹)
HashMap:儲存無序,不能儲存重複值(使用的時候要重寫hasCode和equals方法)
LinkHashMap集合:(雜湊表+連結串列)
相比HashMap底層多了連結串列結構,使得它儲存有序
TreeMep集合:(紅黑樹)
同樣可以使用自然排序和比較器排序