在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));
}

当前回答

for (String name : new ArrayList<String>(names)) {
    // Do something
    names.remove(nameToRemove);
}

克隆列表名称并在从原始列表中删除时遍历克隆名称。比上面的答案简洁一点。

其他回答

那些说你不能安全地从集合中删除一个项的说法是不正确的,你可以使用一个并发集合,比如ConcurrentHashMap。

Use

.remove() Interator或

Use

CopyOnWriteArrayList

为了在迭代集合时安全地从集合中删除,您应该使用迭代器。

例如:

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构造隐式遍历列表会创建一个不可访问的迭代器。这些信息可以在这里找到

试试这个。并将条件更改为“WINTER”,你会想:

public static void main(String[] args) {
  Season.add("Frühling");
  Season.add("Sommer");
  Season.add("Herbst");
  Season.add("WINTER");
  for (String s : Season) {
   if(!s.equals("Sommer")) {
    System.out.println(s);
    continue;
   }
   Season.remove("Frühling");
  }
 }
for (String name : new ArrayList<String>(names)) {
    // Do something
    names.remove(nameToRemove);
}

克隆列表名称并在从原始列表中删除时遍历克隆名称。比上面的答案简洁一点。