Java,从ArrayList中删除对象

时间:2015-05-23 08:23:14

标签: java arraylist iterator

我有ClassA,它有一个静态的ArrayList of Objects

public static ArrayList<Meteorit> meteorits = new ArrayList<Meteorit>();

现在我想从此列表中删除一个对象

ClassA.meteorits.remove(this);

这是用Meteorit类编写的。但是当我想使用ArrayList中的对象时,它会引发异常。

Exception in thread "LWJGL Application" java.util.ConcurrentModificationException

我使用Iterator从ArrayList中删除对象,但现在我不知道在这种情况下如何使用它。

4 个答案:

答案 0 :(得分:2)

这是因为某个线程实际上是在每个循环中查看此列表,也许您尝试在每个循环中删除此列表的元素?你不能删除每个中的元素,但你可以在迭代器循环中删除:

您可以使用迭代器代替每个迭代器来删除和查看列表中的元素,如下所示:

public static ArrayList<Meteorit> meteorits = new ArrayList<Meteorit>();

Iterator<Meteorit> itr = meteorits.iterator();

while (itr.hasNext()) {
       if (itr.next()==this) {
          itr.remove();
       }
}

答案 1 :(得分:1)

使用迭代器时;您需要使用迭代器从列表中删除项目:

iterator.remove();
来自Java Docs的

说:

  

从底层集合中移除此迭代器返回的最后一个元素。

通过任何其他方式从列表中删除项目将导致您看到的ConcurrentModificationException。

答案 2 :(得分:1)

基本上,您需要使用迭代器来避免这种并发修改:

List<String> list = new ArrayList<>();
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
    String string = iterator.next();
    if (string.isEmpty()) {
        iterator.remove();
    }
}

有关详细信息,请查看此帖:

Iterating through a Collection, avoiding ConcurrentModificationException when removing in loop

答案 3 :(得分:0)

Iterator<Integer> itr = yourlist.iterator();

// remove all even numbers
while (itr.hasNext()) {
       itr.remove();
}

这一定对您有用,解决此问题的其他方法是使用CopyOnWriteArrayList,希望它有所帮助。