Collection 接口核心方法分類
| 分類 | 方法 | 說明 |
| 添加 | boolean add(E e) | 添加單個元素 |
boolean addAll(Collection extends E> c) | 批量添加 |
| 刪除 | boolean remove(Object o) | 刪除指定元素 (首次出現) |
boolean removeAll(Collection> c) | 刪除所有包含在 c 中的元素 |
void clear() | 清空集合 |
| 判斷 | boolean contains(Object o) | 是否包含指定元素 |
boolean isEmpty() | 是否為空 |
| 獲取 | Iterator iterator() | 獲取迭代器 |
int size() | 元素個數 |
| 交集 | boolean retainAll(Collection> c) | 僅保留與 c 共有元素 (求交集) |
| 轉數組 | Object[] toArray() / T[] toArray(T[] a) | 集合轉數組 |
ArrayList 實戰演示
import java.util.*;
public class CollectionDemo {
public static void main(String[] args) {
ArrayList list = new ArrayList<>();
// 1. 添加
list.add("Java基礎");
list.add("集合框架");
list.add("多線程");
list.add("JVM調優");
System.out.println("原集合: " + list); // [Java基礎, 集合框架, 多線程, JVM調優]
// 2. 刪除
list.remove("多線程"); // 刪除指定元素
// list.removeAll(Arrays.asList("JVM調優")); // 批量刪除
// list.clear(); // 清空
System.out.println("刪除後: " + list); // [Java基礎, 集合框架, JVM調優]
// 3. 判斷
System.out.println("包含'集合框架'? " + list.contains("集合框架")); // true
System.out.println("是否為空? " + list.isEmpty()); // false
// 4. 獲取大小
System.out.println("大小: " + list.size()); // 3
// 5. 迭代器遍歷 (標準模式)
System.out.println("--- 迭代器遍歷 ---");
for (Iterator it = list.iterator(); it.hasNext(); ) {
System.out.println(it.next());
}
// 6. 交集
ArrayList other = new ArrayList<>(Arrays.asList("集合框架", "JVM調優", "設計模式"));
list.retainAll(other); // list 變為 [集合框架, JVM調優]
System.out.println("交集後: " + list);
// 7. 轉數組
String[] arr = list.toArray(new String[0]);
System.out.println("數組: " + Arrays.toString(arr));
}
}
迭代器模式深度解析
- 角色:集合 (Aggregate) 提供
iterator() 返回迭代器 (Iterator);迭代器封裝遍歷狀態 (游標)。
- 核心方法:
hasNext() 判斷、next() 取出、remove() 刪除當前元素 (唯一安全刪除方式)。
- Fail-Fast:遍歷過程中若集合結構被修改 (非迭代器自身
remove),拋 ConcurrentModificationException。
List 介面特有方法 (ArrayList 體現)
| 分類 | 方法 | 說明 |
| 添加 | void add(int index, E element) | 指定位置插入 |
boolean addAll(int index, Collection extends E> c) | 指定位置批量插入 |
| 刪除 | E remove(int index) | 刪除指定位置元素,返回被刪元素 |
| 修改 | E set(int index, E element) | 替換指定位置元素,返回舊元素 |
| 查詢 | E get(int index) | 獲取指定位置元素 |
List subList(int from, int to) | 截取子列表 [from, to) (視圖,底層共享數組) |
int indexOf(Object o) / lastIndexOf | 首次/最後一次出現位置 |
| 迭代器 | ListIterator listIterator() | 雙向迭代器,支援 hasPrevious/previous/add/set |
ListIterator 實戰:雙向遍歷與修改
List list = new ArrayList<>(Arrays.asList("A", "B", "C"));
ListIterator li = list.listIterator();
// 正向
while (li.hasNext()) {
String s = li.next();
if ("B".equals(s)) li.set("B2"); // 修改
}
// 反向
while (li.hasPrevious()) {
System.out.println(li.previous()); // C2, B2, A
}
System.out.println(list); // [A, B2, C]
避坑指南
- 遍歷中刪除:只能用
iterator.remove(),不能 list.remove() (拋 CME)。
- subList 視圖:操作子列表會影響原列表,且原列表結構變更會導致子列表失效。
- toArray 型別:用
toArray(new String[0]) 獲取泛型數組,避免 Object[] 強轉報錯。
- ListIterator add/set:只能在
next/previous 後調用,否則拋 IllegalStateException。
總結
Collection 接口定義了集合通用契約,ArrayList 作為 List 典型實現,提供隨機訪問 (O(1))、順序遍歷、動態擴容。掌握增刪改查、迭代器、ListIterator、交集/轉數組等核心操作,是 Java 日常開發與面試的必考基本功。