在Java中,当使用foreach循环遍历集合时,对集合调用remove是否合法?例如:
List<String> names = ....
for (String name : names) {
// Do something
names.remove(name).
}
作为附录,移除尚未迭代的项目是否合法?例如,
//Assume that the names list as duplicate entries
List<String> names = ....
for (String name : names) {
// Do something
while (names.remove(name));
}
为了在迭代集合时安全地从集合中删除,您应该使用迭代器。
例如:
List<String> names = ....
Iterator<String> i = names.iterator();
while (i.hasNext()) {
String s = i.next(); // must be called before you can call i.remove()
// Do something
i.remove();
}
摘自Java文档:
该类的迭代器和listIterator返回的迭代器
方法是快速失败的:如果列表在任何地方被结构修改
方法创建迭代器后的任何时间
迭代器自己的remove或add方法时,迭代器将抛出
并发修改异常因此,面对并发
修改后,迭代器会快速而干净地失败,而不是
在不确定的时间冒着武断的、不确定的行为的风险
在未来。
也许许多新手不清楚的是,使用for/foreach构造隐式遍历列表会创建一个不可访问的迭代器。这些信息可以在这里找到