为什么 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,添加会将调用 nextIndex
或 previousIndex
返回的值增加 1,因此当您添加时,光标移动到此项在 next()
上,光标返回了您添加的元素之后的元素。要查看,您必须先调用 .previous()
,然后调用 next()
。
学习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,添加会将调用 nextIndex
或 previousIndex
返回的值增加 1,因此当您添加时,光标移动到此项在 next()
上,光标返回了您添加的元素之后的元素。要查看,您必须先调用 .previous()
,然后调用 next()
。