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

Java 集合框架實戰:Collection retainAll 與 ListIterator 雙向遍歷與修改

     編輯:Java 相關知識

通過兩個精煉示例,演示 Collection.retainAll() 求交集與 ListIterator 雙向遍歷、游標插入的核心用法,助你掌握集合操作的高階技巧。

示例一:retainAll 就地求交集

Collection<String> c1 = new ArrayList<>(Arrays.asList("aaa", "bbb", "ccc"));
Collection<String> c2 = new ArrayList<>(Arrays.asList("ddd", "ccc", "eee"));

boolean changed = c2.retainAll(c1);  // c2 變為 ["ccc"]
System.out.println(changed);         // true
System.out.println(c2);              // [ccc]
  • retainAll 會修改調用者,只保留參數集合中也存在的元素。
  • 返回 boolean 指示調用者是否發生變化。
  • 等價於數學交集:c2 ∩ c1。

示例二:ListIterator 雙向游標與安全插入

List<String> list = new ArrayList<>(Arrays.asList("aaa", "bbb", "ccc"));
ListIterator<String> it = list.listIterator();

// 正向遍歷
while (it.hasNext()) {
    System.out.println(it.next());  // aaa, bbb, ccc
}

// 反向遍歷(游標已在尾部)
while (it.hasPrevious()) {
    System.out.println(it.previous()); // ccc, bbb, aaa
}

// 正向遍歷時在第 2 個位置插入 "ddd"
while (it.hasNext()) {
    if (it.nextIndex() == 2) {  // 下一個元素索引為 2
        it.add("ddd");          // 插入到索引 2 處,原元素後移
    }
    System.out.println(it.next());
}
// 結果:aaa, bbb, ddd, ccc

// 再次反向驗證
while (it.hasPrevious()) {
    System.out.println(it.previous());
}

關鍵點

  1. 游標位置:nextIndex() 返回下一個元素索引,previousIndex() 返回上一個元素索引。
  2. add(E) 在游標前插入,不影響後續 next()/previous() 的正確性。
  3. set(E) 替換最近一次 next() 或 previous() 返回的元素。
  4. remove() 刪除最近一次訪問的元素,僅可調用一次ต่อ一次遍歷操作。

最佳實踐提醒

  • 優先使用 ListIterator 而非索引循環(for (int i=0; i<list.size(); i++))進行需要修改的遍歷,避免下標錯亂。
  • retainAll、removeAll、containsAll 等批量操作均依賴 equals(),確保元素類型正確實現 equals/hashCode。
  • 並發環境下,集合操作需外部同步或使用 CopyOnWriteArrayList 等線程安全實現。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved