首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 集合框架深度解析:ListIterator 介面與安全迭代修改

     編輯:Java 綜合教學

前言:Iterator 的局限性

在 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 介面

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());
}

關鍵點總結

  1. 僅 List 擁有 ListIterator,Set、Queue 等不支持。
  2. set() 必須在 next() 或 previous() 之後調用,否則拋出 IllegalStateException。
  3. 游標位置:初始指向索引 0;next() 後游標右移;previous() 後游標左移。
  4. 並發環境下仍需額外同步,ListIterator 非線程安全。

結語

掌握 ListIterator 可讓你在需要頻繁修改列表元素的場景(如列表去重、就地轉換)中編寫更安全、高效的代碼。它是 Java 集合框架中「可變序列遍歷」的利器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved