如何解决为什么在迭代过程中看不到Iterator的修改?
在学习了 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");
}
}
我期望的是迭代器在'yellow'
之后添加'blue'
。但是当我运行它时,我感到惊讶。结果是:
red-blue-green
不是我所期望的:
red-blue-yellow-green
迭代器 add()
方法在迭代期间不更新收集的意义是什么?是的,如果我叫System.out.println(colors)
,它将显示全部4种颜色。但是为什么不简单地添加'yellow'
以便 Iterator 可以“看到”呢?
解决方法
首先,就是这样,因为它是这样指定的:
JavaDocs for ListIterator.add:
将新元素插入到隐式光标之前:对next的后续调用将不受影响,而对previous的后续调用将返回新元素。
我认为此决定的基本原理是这样的:
如果您只是添加了一个元素,那么通常不希望在下次调用next()
时立即对其进行处理。相反,大多数情况下,您只想在开始迭代之前根据集合中包含的元素将元素添加到集合中。您已经知道刚刚添加的元素,因此可以直接进行它需要的任何处理。
根据java docs for add method of ListIterator,添加将使对nextIndex
或previousIndex
的调用返回的值增加1,因此,添加后,光标移至该项目上next()
,光标在添加的元素之后返回了该元素。为了查看,您必须先致电.previous()
,然后致电next()
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。