在迭代期间,不允许从集合中删除。我有一段代码正在工作,我认为不应该工作。它可能在将来失败,为什么它现在正在运作?
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);
}
}
}
答案 0 :(得分:5)
实际上这应该可行,因为循环中的第一行在每次迭代时都会检索一个全新的迭代器。现在,如果在删除后使用迭代器,则会出现问题。
答案 1 :(得分:1)
通常,当您想要在循环中从集合中删除元素时,请使用Iterator
。您的案例中的一个例子是:
Iterator<Integer> iterator = set.iterator();
while (iterator.hasNext()) {
Integer element = iterator.next();
iterator.remove();
System.out.println("Removed val = " + element);
}
正如其他答案所指出的那样,每个循环都会得到一个新的迭代器,这就是为什么你没有收到错误。
答案 2 :(得分:0)
您的循环不是集合的迭代。 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);
}
}