阿里巴巴手册问题描述大概如下
List<String> list= new ArrayList(50);
list.add("1");
list.add("2");
for (String string : list) {
if("1".equals(string)){
list.remove(string);
}}
如果把1换成2会不会出错
结果显然不是的在把
抛出异常
原因
每次在进行删除和新增时会进行一个modCount++的操作
ArrayList此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。
至于为什么删除1为什么不报错也很简单因为在执行next方法之前先要执行hasNext
这个方法 在删除第一个元素后size就变成了1等于了cursor所以根本没有执行next方法,意思就是根本没有进行第二次循环,所以如果要对集合进行删除操作还是要使用
迭代器的方式