【问题标题】:Collection - Iterator.remove() vs Collection.remove()集合 - Iterator.remove() 与 Collection.remove()
【发布时间】:2012-12-21 10:48:22
【问题描述】:

根据太阳,

"Iterator.remove 是在期间修改集合的唯一安全方法 迭代;如果基础集合是,则行为未指定 在迭代过程中以任何其他方式进行修改。”

我有两个问题:

  1. 是什么让“Iterator.remove()”这个操作比其他操作更稳定?
  2. 如果“Collection.remove()”方法在大多数用例中都没有用,为什么还要提供它?

【问题讨论】:

    标签: java collections iterator concurrentmodification


    【解决方案1】:

    首先,Collection.remove() 非常有用。它适用于很多用例,可能比Iterator.remove() 更适用。

    但是,后者解决了一个特定问题:它允许您在迭代集合时修改集合

    Iterator.remove()解决的问题如下图:

        List<Integer> l = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4));
        for (int el : l) {
            if (el < 3) {
                l.remove(el);
            }
        }
    

    此代码无效,因为在对 l 的迭代期间调用了 l.remove()

    以下是正确的写法:

        Iterator<Integer> it = l.iterator();
        while (it.hasNext()) {
            int el = it.next();
            if (el < 3) {
                it.remove();
            }
        }
    

    【讨论】:

    • 我在l.remove(e1) 之后放了一条break 指令,VM 使用Java 1.6 不会抛出异常
    【解决方案2】:

    如果您正在迭代一个集合并使用:

    Collection.remove() 
    

    您可能会遇到运行时错误(特别是 ConcurrentModifcationException),因为您正在更改之前用于构造完成循环所需的显式调用系列的对象的状态。

    如果你使用:

    Iterator.remove()
    

    您告诉运行时您想要更改底层集合并重新评估完成循环所需的显式调用系列。

    【讨论】:

      【解决方案3】:

      正如您引用的文档明确指出的那样,

      Iterator.remove 是迭代期间修改集合的唯一安全方法

      (强调)

      使用 am 迭代器时,您不能修改集合,除非调用 Iterator.remove()

      如果你不迭代集合,你会使用Collection.remove()

      【讨论】:

        【解决方案4】:

        是什么让“Iterator.remove()”这个操作比其他操作更稳定?

        这意味着迭代器知道你删除了元素,所以它不会产生 ConcurrentModifcationException。

        如果“Collection.remove()”方法在大多数用例中都没有用,为什么还要提供它?

        通常你会使用 Map.remove() 或 Collection.remove() 因为这比遍历每个对象更有效。如果您在经常迭代时删除,我怀疑您应该使用不同的集合。

        【讨论】:

          【解决方案5】:
          1. 只是一种设计选择。可以指定不同的行为(即迭代器必须跳过由 Collection.remove() 删除的值),但这会使集合框架的实现更加复杂。所以选择不指定它。

          2. 非常有用。如果您知道要删除的对象,为什么要迭代?

          【讨论】:

            【解决方案6】:

            据我了解, Collection.remove(int index) 也将返回已删除的对象。 Iterative.remove() 不会。

            【讨论】:

              猜你喜欢
              • 2014-04-17
              • 1970-01-01
              • 2021-08-18
              • 2020-10-24
              • 2018-02-22
              • 2020-05-17
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多