java.util.ConcurrentModificationException
List<String> list = new ArrayList<>();
list.add("Andy");
ListIterator<String> iterator = list.listIterator();
list.add("Tom");
list.add("Jim");
iterator.add("Mary");
iterator.add("Mike");
for(int i = 0; i < list.size(); i++)
System.out.println(list.get(i));
在运行了这段代码后出现了以下的异常
之后打了断点,进行调试,发现异常来自ArrayList的一个内部类中的方法
然后在网上查找了资料后发现List自身的add、remove等方法只会改变modCount的值,不会改变expectedModCount的值。而迭代器的这些方法会同时改变这两个的值。因此若LIst本身和迭代器对同一个集合对象增加元素或者删除元素,这些改变List结构的方法可能会使modCount和expectedModCount值不相同,从而抛出异常。下图表明生成一个迭代器对象的时候(该类为ArrayList的一个内部类),其会自动将modCount的值赋值给ecpectedModCount,保证两个的值相同。
因此,以后若想改变List的结构最好只通过List本身的add、remove等方法(不会检查两个值是否相等),或迭代器中的对应方法(会检查,但会保证两个的值相同)。
参考博客
参考博客原址