增加for循环即foreach循环其实就是根据list对象创建一个iterator迭代对象,用这个迭代对象来遍历list,相当于list对象中元素的遍历托管给了iterator
每次foreach循环时都有以下两个操作:
- iterator.hasNext(); //判读是否有下个元素
- item = iterator.next();//下个元素是什么,并把它赋给item。
1)在使用For-Each快速遍历时,ArrayList内部创建了一个内部迭代器iterator,使用的是hasNext和next()方法来判断和取下一个元素。
2)ArrayList里还保存了一个变量modCount,用来记录List修改的次数,而iterator保存了一个expectedModCount来表示期望的修改次数,在每个操作前都会判断两者值是否一样,不一样则会抛出异常;
3)在foreach循环中调用ArrayList的remove()方法后,会走到fastRemove()方法,该方法不是iterator中的方法,在该方法中modCount++; 而iterator中的expectedModCount并没有改变;
4)再次遍历时,会先调用内部类iteator中的hasNext(),再调用next(),在调用next()方法时,会对modCount和expectedModCount进行比较,此时两者不一致,就抛出了ConcurrentModificationException异常。
总结
如果使用迭代器遍历,就一定要用迭代器删除。如果是使用坐标遍历,就使用集合的remove方法,不要用迭代器删除。