在 Java 集合框架中,Iterator 是遍歷集合的基礎介面,但它存在一個關鍵限制:在迭代過程中不可通過集合本身修改元素,否則會拋出 ConcurrentModificationException。這是因為 Iterator 通過 modCount 機制檢測結構性修改。以下代碼示範了這個問題:
List<String> list = new ArrayList<>();
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String obj = it.next();
if (obj.equals("abc2")) {
list.add("abc9"); // 拋出 ConcurrentModificationException
}
}
ListIterator 是 Iterator 的子介面,**僅適用於 List 及其子類**(如 ArrayList、LinkedList)。它提供了雙向遍歷、索引定位、以及在迭代過程中安全地增、刪、改元素的能力。
hasNext() / next():向前遍歷hasPrevious() / previous():向後遍歷nextIndex() / previousIndex():獲取下一個/上一個元素的索引set(E e):替換最後一次 next() 或 previous() 返回的元素add(E e):在游標位置插入元素remove():刪除最後一次遍歷返回的元素List<String> list = new ArrayList<>();
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4");
ListIterator<String> it = list.listIterator();
// 正向遍歷並修改元素
while (it.hasNext()) {
String obj = it.next();
if (obj.equals("abc2")) {
it.set("abc9"); // 安全替換,不拋出異常
}
}
System.out.println("修改後:" + list); // [abc1, abc9, abc3, abc4]
// 反向遍歷
System.out.println("反向遍歷:");
while (it.hasPrevious()) {
System.out.println(it.previous());
}
set() 必須在 next() 或 previous() 之後調用,否則拋出 IllegalStateException。next() 後游標右移;previous() 後游標左移。掌握 ListIterator 可讓你在需要頻繁修改列表元素的場景(如列表去重、就地轉換)中編寫更安全、高效的代碼。它是 Java 集合框架中「可變序列遍歷」的利器。