Java集合迭代器,是否安全删除元素?

10
我希望能够遍历Set并从中删除满足某些条件的元素。 迭代器文档并没有说明在遍历时修改列表的情况。
这种操作是否可行?如果不行,那么最好的方法是什么?请注意,我只想从迭代器提供的集合中删除元素。
编辑:快速展示了这是可能的。我也可以用以下语法做到吗?
for(Node n : mySet) {
    mySet.remove(n);
}

我可以用以下语法来做吗?不行。 - Thilo
5个回答

18

是的,你可以使用迭代器安全地删除当前元素:

iterator.remove();

remove()方法的Java文档中说:

如果集合中存在指定元素,则从该集合中删除它(可选操作)。更正式地说,如果此集合包含满足 (o==null ? e==null : o.equals(e)) 的元素 e,则删除该元素。如果此集合包含该元素,则返回 true(或等效地,如果由于调用而导致此集合发生更改)。 (一旦调用返回,此集合将不再包含该元素。)


回答你的下一个问题:不行。使用增强型for循环在迭代过程中修改集合会导致 ConcurrentModificationException


1
这是唯一能在迭代时修改集合的方法。其他任何方式都会导致ConcurrentModificationException异常。 - Thilo

1
这在Java 8中得到了改进。现在你可以只需使用以下代码,就能移除元素: mySet.removeIf(element -> someConditionMatches()); 以上代码在java.util.Collection中实现为一个默认方法,可节省每个人编写枯燥循环的时间。此外,该方法适用于任何类型的集合,而不仅限于Set

1

正解是使用迭代器的remove()方法。如果你直接从Set中删除元素而不使用迭代器的remove()方法,会抛出一个名为ConcurrentModificationException的异常。


1

-1
使用增强型for循环无法正常工作,因为您正在修改正在迭代的集合。但是,这只能通过迭代器完成,而这种方式不是这种情况。
这是使用增强型for循环的一个缺点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接