Java Collection-Iterator.remove()与Collection.remove()的比较

Java Collection-Iterator.remove()与Collection.remove()的比较,java,collections,iterator,concurrentmodification,Java,Collections,Iterator,Concurrentmodification,根据太阳报, “Iterator.remove是在运行期间修改集合的唯一安全方法 迭代;如果基础集合为 在迭代过程中以任何其他方式进行修改。” 我有两个问题: 是什么使这个操作“Iterator.remove()”比其他操作更稳定 如果“Collection.remove()”方法在大多数用例中都没有用处,为什么还要提供它呢 正如你引用的文件明确指出的那样 Iterator.remove是在迭代过程中修改集合的唯一安全方法 (增加重点) 使用am迭代器时,您不能修改集合,除非调用iterator

根据太阳报,

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

我有两个问题:

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

  • 正如你引用的文件明确指出的那样

    Iterator.remove是在迭代过程中修改集合的唯一安全方法

    (增加重点)

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


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

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

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

    迭代器.remove()解决的问题如下所示:

        List<Integer> l = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4));
        for (int el : l) {
            if (el < 3) {
                l.remove(el);
            }
        }
    
    是什么使这个操作“Iterator.remove()”比其他操作更稳定

    这意味着迭代器知道您删除了元素,因此它不会生成ConcurrentModificationException

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


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

    如果您在迭代集合时使用:

    Collection.remove() 
    
    您可能会得到运行时错误(特别是ConcurrentModificationException),因为您正在更改以前用于构造完成循环所需的显式调用序列的对象的状态

    如果您使用:

    Iterator.remove()
    
    您告诉运行时您希望更改基础集合并重新计算完成循环所需的显式调用序列

  • 这只是一种设计选择。可以指定不同的行为(即迭代器必须跳过Collection.remove()删除的值),但这会使Collection框架的实现更加复杂。因此,选择不明确

  • 它很有用。如果知道要删除的对象,为什么要迭代


  • 据我所知,Collection.remove(int-index)也将返回已删除的对象。迭代的.remove()不会。

    我在
    l.remove(e1)
    之后放了一条
    break
    指令,VM使用Java 1.6不会抛出异常
    Iterator.remove()