在使用迭代器遍历时,ArrayList 内部创建了一个内部迭代器iterator,在使用next()方法来取下一个元素时,会使用ArrayList里保存的一个用来记录List修改次数的变量modCount,与iterator保存了一个expectedModCount来表示期望的修改次数进行比较,如果不相等则会抛出异常;
而在在foreach循环中调用list中的remove()方法,会走到fastRemove()方法,该方法不是iterator中的方法 ,而是ArrayList中的方法,在该方法只做了modCount++,而没有同步到expectedModCount。 当再次遍历时,会先调用内部类iteator中的hasNext(),再调用next(),在调用next()方法时,会对modCount 和expectedModCount进行比较,此时两者不一致,就抛出了ConcurrentModificationException异常。
所以得用ArrayList的remove还是iterator中的remove。