一、摘要
在介绍 CopyOnWriteArrayList 之前,我们一起先来看看如下方法执行结果,代码内容如下:
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("1");
System.out.println("原始list元素:"+ list.toString());
//通过对象移除等于内容为1的元素
for (String item : list) {
if("1".equals(item)) {
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
方法,源码如下:
/**修改次数检查*/