(java)在迭代器中删除无法应用

时间:2014-09-23 10:07:34

标签: java collections iterator

我试图在迭代列表时从List中删除一些对象。为了避免,ConcurrentModificationException,我使用Iterator并调用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. 在迭代列表时从列表中删除对象是一种很好的做法(甚至是安全的)吗?

6 个答案:

答案 0 :(得分:2)

  

1。为什么我会收到此编译错误以及如何解决它?

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

  

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

是。这是从集合中删除对象的完美方法。

答案 1 :(得分:0)

删除方法不会带任何参数,请尝试

it.remove();

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

答案 2 :(得分:0)

你应该在iterator中调用remove(),不需要任何参数。

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

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

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

答案 3 :(得分:0)

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

 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 :(得分:0)

尝试很多Answers提到的 it.remove(),是的,你可以删除对象,迭代列表时可以安全删除。

答案 5 :(得分:0)

  

为什么我会收到此编译错误以及如何修复它?

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

  

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

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