增强for遍历集合时,修改集合不会报错

用增强for循环遍历的时候修改集合为什么不报错

问题相关代码

public class test04 {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        arrayList.add("123");
        arrayList.add("456");
        for (Object o : arrayList) {
            arrayList.remove(o);
        }
        for (Object o : arrayList) {
            System.out.println(o);
        }
    }
}


运行结果:456

当我用集合的add()方法添加数据会报错,为什么remove方法就不报错了,用remove也改变了索引呀

img

你将代码中的list元素增加到三个以上就会出现与add同样的报错了。
增强for循环等价于以下代码

Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            String next = iterator.next();
            list.remove(next);
}

你那段代码remove循环结束后,list中还剩余一个元素,说明for循环提前结束了。
再看上面的等效代码,这个代码是编译后jvm实际执行的代码。
while中的条件hasNext(),这个条件的内容是cursor != size cursor是iterator当前偏移的位置 size是list的大小。初始cursor=0。
当list.remove("123")执行完后,cursor=1,而此时list的size也为1cursor != sizefalse,即hasNext()为false,while循环跳出,后面的"456"仍然留在list中。如果执行到第二个remove("456"),就会报与add相同的异常了。