泛型與集合(一)
- 泛型
- 泛型的核心作用
- 泛型類型(類)
- 定義與使用
- 類型參數命名約定
- 泛型方法
- 定義與調用
- 與泛型類的區別
- 通配符
- 上界通配符
- 下界通配符
- 有界類型參數
- 類型擦除
- 集合框架
- 核心接口
- Collection 接口
- Map 接口
- Collection 接口操作的常用方法
- 基本操作
- 批量操作
- 數組操作
- 流操作方法
- List 接口及實現類
- List 接口
- List 接口概述
- List 接口常用方法
- List 接口與 Collections 接口
- ArrayList 類
- 特點與實現原理
- 構造方法
- 遍歷集合元素
- 使用簡單的 for 循環
- 使用增強的 for 循環
- 使用迭代器
- 雙向迭代器
- 數組轉換為 List 對象
- 使用 Arrays.asList() 方法
- 手動遍歷數組添加到 ArrayList
- 使用 Java 8 Stream API
- 基本類型數組轉換為 List
- Vector 類和 Stack 類
- Vector 類
- 概述
- 常用方法
- Stack 類
- 概述
- 常用方法
泛型
泛型的核心作用
泛型是 Java 實現代碼復用和類型安全的重要機制。它允許在類、接口和方法中定義類型參數,使代碼能處理多種數據類型,同時避免強制類型轉換和運行時類型錯誤。例如,在集合中使用泛型,可確保集合中元素類型的一致性,在編譯階段就能檢測出類型錯誤,增強代碼的健壯性和可讀性。
泛型類型(類)
定義與使用
定義泛型類時,通過尖括號 聲明類型參數,T 可以是類、接口、數組類型(基本數據類型需使用包裝類型)。以 Box 類為例:
public class Box<T> {private T content;public void setContent(T content) {this.content = content;}public T getContent() {return content;}
}
使用時,需指定具體的類型參數。從 Java 7 開始,可使用菱形語法簡化創建對象的過程:
Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
System.out.println(stringBox.getContent());
類型參數命名約定
類型參數命名通常使用單個大寫字母作為類型參數名,常見的有 E(表示元素)、K(表示鍵)、V(表示值)、T(表示類型)、N(表示數字)等。遵循這些約定,能使代碼更易理解。
泛型方法
定義與調用
泛型方法在方法返回值前聲明類型參數 ,其作用域僅限于該方法。例如,定義一個打印數組元素的泛型方法:
public static <T> void printArray(T[] array) {for (T element : array) {System.out.print(element + " ");}System.out.println();
}
調用時,編譯器會自動推斷類型:
Integer[] intArr = {1, 2, 3};
printArray(intArr);
與泛型類的區別
泛型類的類型參數作用于整個類,而泛型方法的類型參數僅在聲明的方法內有效。泛型方法還可以在非泛型類中定義,增加了代碼的靈活性。
通配符
上界通配符
上界通配符(<?extends T>)用于限制類型為T或其子類,增強泛型的靈活性。例如,計算列表中數字元素總和的方法:
public static double sum(List<? extends Number> list) {double sum = 0;for (Number num : list) {sum += num.doubleValue();}return sum;
}
該方法可接受 List<Integer>、List<Double> 等類型的參數。
下界通配符
下界通配符(<?super T>)限制類型為 T 或其父類。比如,向列表中添加 Integer 類型元素的方法:
public static void addNumbers(List<? super Integer> list) {list.add(1);list.add(2);
}
此方法可接受 List<Number>、List<Object> 等類型的參數。
有界類型參數
使用 extends 或 super 限制類型參數的范圍。例如,定義一個計算數字平方的 Calculator 類:
public class Calculator<T extends Number> {public double square(T num) {return num.doubleValue() * num.doubleValue();}
}
類型擦除
泛型在編譯后會被替換為 Object 或邊界類型,運行時無法獲取泛型信息。例如, List 和 List 在運行時都變為 List。這是為了保持 Java 的向后兼容性,但也帶來了一些局限性,如無法在運行時根據泛型類型進行不同的處理。
集合框架
核心接口
Collection 接口
是所有集合的根接口,繼承了 Iterable 接口,定義了集合的基本操作方法。它的主要子接口有 List、Set、Queue,每個子接口都有不同的特性和用途。List 是有序且可重復的集合,Set 是無序且不可重復的集合,Queue 是按特定順序處理元素的集合。
Map 接口
用于存儲鍵值對,與 Collection 接口并列。在 Map 中,鍵是唯一的,值可以重復,常用于根據鍵快速查找值的場景。
Collection 接口操作的常用方法
基本操作
- 向集合中添加元素 e:
boolean add(E e)
- 從集合中刪除指定的元素 o:
boolean remove(Object o)
- 返回集合中是否包含指定的元素 o:
boolean contains(Object o)
- 返回集合是否為空,即不包含元素:
boolean isEmpty()
- 返回集合中包含的元素個數:
int size()
- 返回包含所有元素的迭代器對象:
Iterator iterator()
- 從父接口繼承的方法,在集合的每個元素上執行指定的操作:
default void forEach(Consumer<? super T>action)
以下是這些方法的代碼示例:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.function.Consumer;public class CollectionExample {public static void main(String[] args) {// 創建一個集合對象,這里以ArrayList為例,它實現了Collection接口Collection<Integer> collection = new ArrayList<>();// 測試add方法boolean addResult = collection.add(5);System.out.println("添加元素結果: " + addResult);// 測試remove方法boolean removeResult = collection.remove(5);System.out.println("刪除元素結果: " + removeResult);// 測試contains方法collection.add(10);boolean containsResult = collection.contains(10);System.out.println("集合是否包含元素: " + containsResult);// 測試isEmpty方法boolean isEmptyResult = collection.isEmpty();System.out.println("集合是否為空: " + isEmptyResult);// 測試size方法int size = collection.size();System.out.println("集合元素個數: " + size);// 測試iterator方法Iterator<Integer> iterator = collection.iterator();while (iterator.hasNext()) {Integer element = iterator.next();System.out.println("迭代器遍歷元素: " + element);}// 測試forEach方法collection.add(20);collection.forEach(new Consumer<Integer>() {@Overridepublic void accept(Integer integer) {System.out.println("forEach方法操作元素: " + integer);}});}
}
批量操作
- 將集合c中的所有元素添加到當前集合中:
boolean addAll(Collection<? extends E> c)
- 從當前集合中刪除 c 中的所有元素:
boolean removeAll(Collection<?> c)
- 從當前集合中刪除滿足謂詞的所有元素:
default boolean removeIf(Predicate<? super E> filter)
- 返回當前集合是否包含 c 中的所有元素:
boolean containsAll(Collection<?> c)
- 在當前集合中只保留指定集合 c 中的元素,其他元素刪除:
boolean retainAll(Collection<?> c)
- 將集合清空:
void clear()
以下是這些方法的代碼示例:
import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Predicate;public class CollectionBatchOperationsExample {public static void main(String[] args) {