宁波外贸公司网站建设,和幼儿做网站,开发者应用,合肥建网站公司平时大家for循环应该用的不少#xff0c;特别是增强for循环#xff0c;简单快捷。但是在增强for中做删除操作#xff0c;却会抛出java.util.ConcurrentModificationException#xff0c;一起来看下。上面的代码#xff0c;在for循环执行完if中的remove#xff0c;遍历下一…平时大家for循环应该用的不少特别是增强for循环简单快捷。但是在增强for中做删除操作却会抛出java.util.ConcurrentModificationException一起来看下。上面的代码在for循环执行完if中的remove遍历下一个元素时便会抛出java.util.ConcurrentModificationException。到底在for (String s : list)中发生了什么呢。ArrayList中有一个内部类Itr它继承了Iterator接口。当第一次遍历增强for循环时会创建一个Itr对象注意下图红框的部分变量modCount属于ArrayList用来记录ArrayList被修改的次数赋值给了Itr类的变量expectedModCount。然后依次调用Itr的hasNext()和next()方法取出ArrayList中的元素赋值给for中的变量注意红框的方法checkForComodification()。当执行list.remove(s)时实则调用其内部的fastRemove(index)做的删除操作同时modCount,但是并没有重新赋值给Itr类的变量expectedModCount。那么当遍历下一个元素调用checkForComodification()方法时if中的条件就会成立然后就会抛出ConcurrentModificationException异常。既然增强for循环中的remove操作会抛异常那么在普通for循环和迭代器循环中做remove也会抛异常吗普通for循环普通for循环调用的是remove(int index)方法不会抛异常但是需要注意1. 如果将for中的i list.size()替换成i length会抛出IndexOutOfBoundsException2. 在list.remove(i)后下一次遍历前此时i表示第i1个元素迭代器循环迭代器循环调用的是Itr类的remove(int index)方法不会抛异常原因是其内部也是调用的ArrayList的remove(int index)方法但是在之后有给expectedModCount重新赋值。所以增强for循环实际上还是迭代器遍历但是remove操作并没有同步变量会导致异常普通for虽然没有异常但是在remove后可能会忽略下标1而出错如果要在遍历时删除最安全就是用迭代器。