为什么这个java代码有效?

时间:2016-10-31 20:41:08

标签: java collections iterator iteration

在迭代期间,不允许从集合中删除。我有一段代码正在工作,我认为不应该工作。它可能在将来失败,为什么它现在正在运作?

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

}

3 个答案:

答案 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);
    }
  }
相关问题