java基础知识点整理
为什么禁止在foreach循环里面进行元素的remove/add操作
foreach循环(增强for循环)
-
增强for循环,其实是依赖了Iterator实现的。
-
运行结果抛出ConcurrentModificationException,同样的,如果尝试在foreach中添加一个元素也会抛同样的错误。
-
之所以会出现这个异常,是因为出发了一个Java集合的错误检查机制:fail-fast。
foreach循环的实质
-
使用了 Iterator 对象进行遍历
String s; for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(s)) s = (String)iterator.next(); -
如果对集合对象进行修改/删除,那么集合对象的 modCount 会进行加1,而Iterator对象的 expectedModCount 不会发生改变
-
checkForComodification方法校验会报错
final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); }
建议
以上几种方式都可以避免触发fail-fast机制,避免抛出异常。如果是并发场景,建议使用concurrent包中的容器;
如果是单线程场景,Java8之前的代码中建议使用Iterator进行元素删除/添加;Java8之后可以考虑使用Stream及filter.

浙公网安备 33010602011771号