记录一个 foreach 和迭代器中的list remove放法问题

先看一下正面例子:

记录一个 foreach 和迭代器中的list remove放法问题

然后再看一下反面的例子:

记录一个 foreach 和迭代器中的list remove放法问题

但是我们换一下判断条件

记录一个 foreach 和迭代器中的list remove放法问题

原因如下(自己看源码的理解):ArrayList源码中remove和add方法 有一个modCount字段用来记录集合改变的次数,ArrayList中remove方法调用的时候 会对modCount进行++操作,而使用foreach其实底层也是用的 迭代器,迭代器next方法中用到了一个checkForComodification这个方法,这个方法中时判断modCount 和expectedModCount是否相等,如果不等就会抛出上面的异常,但是 ArrayList remove方法中并没有维护expectedModCount 和modCount的关系,只有在ArrayList中的内部类中的Itr 的remove才把modCount赋值给了expectedModCount

看源码图(ArrayList的remove 方法)

记录一个 foreach 和迭代器中的list remove放法问题

Itr中的remove方法,其中ArrayList.this.remove就是操作了modCount 然后就是把它赋值给了expectedModCount

记录一个 foreach 和迭代器中的list remove放法问题

 

上面说到foreach 底层其实是迭代器,所以循环一次就会调用迭代器的next()方法

记录一个 foreach 和迭代器中的list remove放法问题

 

好了真相就是这样的