【问题标题】:Why is this java code working?为什么这个java代码有效?
【发布时间】:2016-10-31 20:41:08
【问题描述】:
在迭代期间,不允许从集合中删除。我有一段正在工作的代码,我认为它不应该工作。它将来会失败吗?为什么它现在可以工作?
public class RemoveFromSet {
static Set<Integer> set = new HashSet<>();
public static void main(String[] args) {
set.add(1);
set.add(2);
set.add(3);
set.add(4);
while(set.size()>0) {
int val = set.iterator().next();
set.remove(val);
System.out.println("removed val = "+val);
}
}
}
【问题讨论】:
标签:
java
collections
iterator
iteration
【解决方案1】:
实际上,这应该可以工作,因为循环中的第一行每次迭代都会检索一个全新的迭代器。现在,如果您在删除后使用迭代器,您将遇到问题。
【解决方案2】:
通常,当您想在循环中从集合中删除元素时,您会使用Iterator。你的例子是:
Iterator<Integer> iterator = set.iterator();
while (iterator.hasNext()) {
Integer element = iterator.next();
iterator.remove();
System.out.println("Removed val = " + element);
}
正如其他答案所指出的,每个循环都会得到一个新的迭代器,这就是为什么你没有收到错误的原因。
【解决方案3】:
您的循环不是集合的迭代。 for 条件不依赖于迭代器。
在循环内部创建的迭代器独立于 for 条件,因为在循环内部创建,而且您不会在该迭代器上进行迭代:您在每次迭代时创建它并只取第一个值。
如果您真的使用迭代器对集合进行迭代,它将失败:
public static void main(String[] args) {
set.add(1);
set.add(2);
set.add(3);
set.add(4);
for (Iterator iterator = set.iterator(); iterator.hasNext();) {
Integer integer = (Integer) iterator.next();
set.remove(integer);
System.out.println("removed val = " + integer);
}
}