【问题标题】:(java) remove in iterator cannot be applied(java) 无法应用迭代器中的删除
【发布时间】:2014-09-23 10:07:34
【问题描述】:

我试图在迭代列表时从列表中删除一些对象。为了避免 ConcurrentModificationException,我使用了一个迭代器并调用了 remove()。这部分代码如下所示。

  Iterator<ClassName> it = classList.iterator();

    while(it.hasNext()) {
        ClassName obj = it.next();
        if(obj.getData() == 1) {
            it.remove(obj);
        }
    }

我收到以下错误:java.util.Iterator 中的 remove() 无法应用于 (ClassName)。我有两个问题

  1. 为什么会出现此编译错误以及如何解决?
  2. 在迭代列表时从列表中删除对象是一种好的做法(甚至是安全的)吗?

【问题讨论】:

    标签: java collections iterator


    【解决方案1】:

    1.为什么会出现此编译错误以及如何解决?

    it.remove()(不要给它任何参数)。该方法将从基础集合中删除当前对象。

    2.在迭代列表时从列表中删除对象是一种好的做法(甚至是安全的)吗?

    是的。这是从集合中删除对象的绝佳方式。

    【讨论】:

    • 谢谢!我应该注意到了!
    【解决方案2】:

    您应该在不带参数的iterator 中调用remove()

    Iterator<ClassName> it = classList.iterator();
    
    while(it.hasNext()) {
        ClassName obj = it.next();
        if(obj.getData() == 1) {
            it.remove();
        }
    }
    

    是的,迭代器是在迭代时删除对象的方法。

    【讨论】:

      【解决方案3】:

      没有将争论作为对象的迭代器方法。

       Iterator<ClassName> it = classList.iterator();
      
          while(it.hasNext()) {
              ClassName obj = it.next();
              if(obj.getData() == 1) {
                  it.remove();
              }
          }
      

      Iterator.remove() 是安全的。

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

      来自:

      http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html

      【讨论】:

        【解决方案4】:

        尝试许多答案中提到的 it.remove(),是的,您可以删除对象,并且在迭代列表时删除是安全的。

        【讨论】:

          【解决方案5】:

          为什么会出现此编译错误以及如何修复它?

          您不需要将对象传递给它。当前对象将被直接删除。 it.remove()就够了

          在迭代列表时从列表中删除对象是一种好的做法(甚至是安全的)吗?

          是的。可以迭代并从中删除一个元素。 直接从列表中删除对象而不是迭代器是不好的做法/安全。当您尝试直接从列表中删除并在其上循环时,会导致ConcurrentModificationException

          【讨论】:

            【解决方案6】:

            remove方法不带任何参数,试试

            it.remove();
            

            如果您使用迭代器,则在从列表中迭代时删除对象没有任何害处,但直接调用 myList.remove(obj/index) 可能会导致 ConcurrentModificationException。在多线程环境中时应小心。

            【讨论】:

            • 你也可以在单线程程序中获得 ConcurrentModificationExceptions。
            • @aioobe 是的,如果我们调用 list.remove() 但 OP 正在使用迭代器
            • 您的回答似乎表明在单线程环境中不需要谨慎,这是错误的。
            • @aioobe 谢谢我更新了我的答案,希望现在更清楚
            猜你喜欢
            • 2012-11-30
            • 2017-11-20
            • 2015-09-01
            • 2016-07-19
            • 2011-01-22
            • 1970-01-01
            • 2021-05-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多