为什么 Iterator 的修改在迭代过程中不可见?

Why modifications from Iterator aren't visible during iteration?

学习Java一段时间后,我决定修改listIterator方法。所以我做了以下简单的代码:

List<String> colors = new ArrayList<>();
colors.add("red");
colors.add("blue");
colors.add("green");

ListIterator<String> iterator = colors.listIterator();

while (iterator.hasNext()){
    String color = iterator.next();
    System.out.println(color);

    if (color.equals("blue")){
        iterator.add("yellow");
    }
}

我所期待的是 iterator'blue' 之后添加 'yellow'。但是当我 运行 它时,我感到很惊讶。结果是:

red-blue-green

并不像我预期的那样:

red-blue-yellow-green

迭代器的 add()方法在迭代期间不更新收集有什么意义?是的,如果我调用 System.out.println(colors),它会显示所有 4 种颜色。但是为什么不简单的加上'yellow'这样Iterator就可以'see'呢?

首先,它是这样的,因为它是这样指定的:

JavaDocs for ListIterator.add:

The new element is inserted before the implicit cursor: a subsequent call to next would be unaffected, and a subsequent call to previous would return the new element.

我想这个决定背后的理由是这样的: 如果您刚刚添加了一个元素,您通常不会在下次调用 next() 时立即处理它。相反,最常见的情况是,您只想根据集合在开始迭代之前包含的元素将元素添加到集合中。您已经知道刚刚添加的元素,因此您可以直接对其进行任何需要的处理。

根据 java docs for add method of ListIterator,添加会将调用 nextIndexpreviousIndex 返回的值增加 1,因此当您添加时,光标移动到此项在 next() 上,光标返回了您添加的元素之后的元素。要查看,您必须先调用 .previous(),然后调用 next()