Java 在ArrayList中添加/删除方法与设置方法

Java 在ArrayList中添加/删除方法与设置方法,java,arraylist,Java,Arraylist,在将foreach与ArrayList一起使用时,我知道使用add/remove方法将不起作用,因为它将引发并发修改异常,但是为什么我能够在同一个foreach循环中使用set方法更改值呢 以下是示例代码: for (Integer integer : arr) { if (integer==2) { arr.set(1, 6); } System.out.println(integer); } Sy

在将foreach与ArrayList一起使用时,我知道使用add/remove方法将不起作用,因为它将引发并发修改异常,但是为什么我能够在同一个foreach循环中使用set方法更改值呢

以下是示例代码:

    for (Integer integer : arr) {
        if (integer==2) {
            arr.set(1, 6);
        }
        System.out.println(integer);
    }
    System.out.println(arr);

如果我们将更改arr.add(),那么它将抛出一个错误,但是使用set它工作正常,原因是什么?

根据,如果在创建迭代器后对列表进行结构修改,则会抛出CME。由于
set()
仅替换现有元素,因此不会发生结构修改,也不会引发异常。

实现中存在差异。当列表的长度被修改时(这是
add
方法所做的),ArrayList返回的迭代器抛出ConcurrentModificationException,因为它检查数组的长度。而
set
方法不会修改数组的长度,因此不会引发ConcurrentModificationException。

结构修改是添加或删除一个或多个元素,或显式调整支持数组大小的任何操作;仅仅设置元素的值并不是一种结构修改完全同意和理解。问题是我需要更详细地阅读文档,而不仅仅是阅读哪种方法有效。谢谢,文件里的完整句子。。。如果在创建迭代器后的任何时候,以迭代器自己的remove或add方法以外的任何方式对列表进行结构修改,迭代器将抛出ConcurrentModificationException。这不是自相矛盾吗?问题是。。我知道使用add/remove方法将无法工作,因为它将引发并发修改异常,但为什么我能够使用set方法更改值。。。
add
应该也能正常工作,对吧?@nullpointer他说的是直接修改列表。只能通过迭代器进行修改。