首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >集合- Iterator.remove() vs Collection.remove()

集合- Iterator.remove() vs Collection.remove()
EN

Stack Overflow用户
提问于 2013-01-07 16:58:02
回答 6查看 11.2K关注 0票数 12

根据太阳的说法,

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

我有两个问题:

  1. 是什么使这个操作"Iterator.remove()“比其他操作更稳定?
  2. 如果"Collection.remove()“方法在大多数用例中不起作用,为什么要提供它呢?
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-01-07 17:02:46

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

代码语言:javascript
复制
Collection.remove() 

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

如果你使用:

代码语言:javascript
复制
Iterator.remove()

您告诉运行时,您希望更改基础集合,并重新评估完成循环所需的显式调用系列。

票数 9
EN

Stack Overflow用户

发布于 2013-01-07 17:00:19

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

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

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

代码语言:javascript
复制
    List<Integer> l = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4));
    for (int el : l) {
        if (el < 3) {
            l.remove(el);
        }
    }

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

以下是正确的编写方法:

代码语言:javascript
复制
    Iterator<Integer> it = l.iterator();
    while (it.hasNext()) {
        int el = it.next();
        if (el < 3) {
            it.remove();
        }
    }
票数 16
EN

Stack Overflow用户

发布于 2013-01-07 16:59:38

正如你引用的文件所明确指出的,

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

(强调后加)

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

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14200489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档