在 java iterator 遍历过程中直接调用集合的 add 方法会抛出 concurrentmodificationexception。要安全地添加元素,必须使用迭代器对象自身的 add 方法,该方法会将新元素追加到当前游标之后,且不会破坏遍历状态。

Iterator.add() 与 Collection.add() 的区别是什么
直接使用集合实例的 add 方法会触发快速失败机制,而通过迭代器调用的 add 是受控操作。前者修改了集合的结构计数(modCount),后者则同步更新迭代器的预期修改计数(expectedModCount)。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class SafeAddExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
// 正确做法:使用 iterator.add()
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String item = it.next();
if (item.equals("A")) {
it.add("C"); // 安全添加
}
}
System.out.println(list); // 输出: [A, C, B]
}
}上述代码中,当迭代器位于 "A" 时调用 it.add("C"),新元素被插入到 "A" 和 "B" 之间。遍历继续时,迭代器会跳过刚添加的元素,继续处理 "B"。如果改用 list.add("C"),则在 it.next() 或下一次 hasNext() 检查时会检测到 modCount 不一致并抛出异常。
立即学习“Java免费学习笔记(深入)”;
遍历时删除元素后还能继续添加吗
可以。迭代器支持在遍历过程中交替进行删除和添加操作。只要始终通过迭代器接口进行操作,内部的状态机就能正确维护游标位置和结构一致性。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class AddAfterRemoveExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("X");
list.add("Y");
list.add("Z");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String item = it.next();
if (item.equals("Y")) {
it.remove(); // 先删除 Y
it.add("W"); // 再添加 W
}
}
System.out.println(list); // 输出: [X, W, Z]
}
}在这个例子中,Y 被移除后,游标位置调整,随后 W 被添加到当前位置。最终列表顺序变为 X, W, Z。这种操作模式在过滤数据并替换元素的场景中非常常见,避免了创建新集合的开销。
如果在循环结束后立即调用 add 会发生什么
如果在 while(it.hasNext()) 循环完全结束后调用 iterator.add(),通常会抛出 IllegalStateException。因为此时迭代器已经到达终点,不再处于“可添加”的有效状态。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class AddAfterLoopExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
it.next();
}
// 循环结束,迭代器已耗尽
try {
it.add("B"); // 抛出 IllegalStateException
} catch (IllegalStateException e) {
System.out.println("Cannot add after iteration ends");
}
}
}


















