iterator遍历中可安全修改元素对象内部状态,但结构性修改(增删)必须通过其remove()方法且需先调用next();直接修改集合结构会触发concurrentmodificationexception。

Iterator 本身不允许在遍历过程中直接修改集合的结构(比如添加、删除元素),否则会抛出 ConcurrentModificationException。但“修改元素”分两种情况:一种是改变元素自身的状态(比如对象的字段),这是安全的;另一种是修改集合的大小或结构(如 list.remove()),必须通过 Iterator 自己的 remove() 方法,且仅限上一次 next() 返回的元素。
能安全做的:修改元素对象的内部属性
如果集合中存的是可变对象(如自定义类、StringBuilder、数组等),你可以直接调用其方法修改内容,Iterator 不会干预。
例如:
List<person> people = new ArrayList(Arrays.asList(
new Person("Alice", 25),
new Person("Bob", 30)
));
Iterator<person> it = people.iterator();
while (it.hasNext()) {
Person p = it.next();
p.setAge(p.getAge() + 1); // ✅ 安全:只改对象内部,集合结构没变
}
</person></person>
必须用 iterator.remove() 删除元素
想在遍历时删掉当前元素,不能用 list.remove(obj) 或 list.remove(index),而要用 it.remove() —— 它是 Iterator 唯一被允许的结构性修改操作。
注意点:
- 必须先调用过
next(),否则调用remove()会抛IllegalStateException - 每个
next()最多只能对应一次remove(),重复调用会异常 -
remove()删除的是上一次next()返回的那个元素
想添加或替换元素?得换方式
Iterator 没有 add() 或 set() 方法(ListIterator 有,但仅适用于 List)。常见替代方案:
- 收集待修改/新增的元素,遍历完再批量处理(如用临时
List存要删的项,最后removeAll) - 对
List,改用ListIterator:支持add()、set()、remove() - 用普通 for 循环(下标访问),适合
List;但要注意删除时索引变化(建议倒序删)
为什么禁止直接修改集合?
因为大多数集合(如 ArrayList、HashMap)的 Iterator 是“快速失败”(fail-fast)的。它内部维护一个 modCount 计数器,每次结构修改都会更新;Iterator 每次操作前检查该值是否匹配,不一致就立即报错——这不是 bug,而是设计用来尽早暴露并发修改问题的机制。











