通過兩個精煉示例,演示 Collection.retainAll() 求交集與 ListIterator 雙向遍歷、游標插入的核心用法,助你掌握集合操作的高階技巧。
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。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());
}
nextIndex() 返回下一個元素索引,previousIndex() 返回上一個元素索引。next()/previous() 的正確性。next() 或 previous() 返回的元素。ListIterator 而非索引循環(for (int i=0; i<list.size(); i++))進行需要修改的遍歷,避免下標錯亂。retainAll、removeAll、containsAll 等批量操作均依賴 equals(),確保元素類型正確實現 equals/hashCode。CopyOnWriteArrayList 等線程安全實現。