Collection - Iterator.remove()vs Collection.remove()

NIN*_*OOP 8 java collections iterator concurrentmodification

按照Sun,

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

我有两个问题:

  1. 是什么让这个操作"Iterator.remove()"比其他操作稳定?
  2. 如果它在大多数用例中没用,它们为什么提供"Collection.remove()"方法呢?

NPE*_*NPE 13

首先,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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

以下是编写它的正确方法:

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


SLa*_*aks 8

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

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

(重点补充)

使用am迭代器时,除了通过调用之外,您无法修改集合Iterator.remove().

如果您没有迭代该集合,那么您将使用Collection.remove().


Sla*_*ast 7

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

Collection.remove() 
Run Code Online (Sandbox Code Playgroud)

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

如果您使用:

Iterator.remove()
Run Code Online (Sandbox Code Playgroud)

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