【问题标题】: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);
          }
        }
      

      【讨论】:

        猜你喜欢
        • 2012-01-05
        • 1970-01-01
        • 2014-02-02
        • 2017-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-17
        • 1970-01-01
        相关资源
        最近更新 更多