list.remove(item);
}
}
System.out.println(“通过对象移除后的list元素:”+ list.toString());
}
执行结果内容如下:
原始list元素:[1, 2, 1]
Exception in thread “main” java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at com.example.container.a.TestList.main(TestList.java:16)
很遗憾,结果并没有达到我们想要的预期效果,执行之后直接报错!抛ConcurrentModificationException异常!
为啥会抛这个异常呢?
我们一起来看看,foreach
写法实际上是对List.iterator()
迭代器的一种简写,因此我们可以从分析List.iterator()
迭代器进行入手,看看为啥会抛这个异常。
ArrayList
类中的Iterator
迭代器实现,源码内容:
通过代码我们发现 Itr
是 ArrayList
中定义的一个私有内部类,每次调用next
、remove
方法时,都会调用checkForComodification
方法,源码如下:
/*修改次数检查/
final void checkForComodification() {
//检查List中的修改次数是否与迭代器类中的修改次数相等
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
checkForComodification
方法,实际上是用来检查List
中的修改次数modCount
是否与迭代器类中的修改次数expectedModCount
相等,如果不相等,就会抛出ConcurrentModificationException
异常!
那么问题基本上已经清晰了,上面的运行结果之所以会抛出这个异常,就是因为List
中的修改次数modCount
与迭代器类中的修改次数expectedModCount
不相同造成的!
阅读过集合源码的朋友,可能想起Vector
这个类,它不是 JDK 中 ArrayList 线程安全的一个版