【问题标题】:Java , Removing object from ArrayListJava,从 ArrayList 中删除对象
【发布时间】:2015-08-05 07:02:47
【问题描述】:

我有 ClassA,它有一个静态的 ArrayList 对象

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

现在我想像这样从这个列表中删除一个对象

ClassA.meteorits.remove(this);

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

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

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

【问题讨论】:

  • ArrayList 为什么是static?我建议完全按照observer 设计模式所做的那样做。首先,在ClassA 中创建一个方法,将其命名为public removeMetorit(Meteorit meteorit),并在除Meteorit 类之外的任何地方使用它。
  • 另外,您正在从要删除的对象内部调用remove 方法,这是非法的。
  • 我希望陨石将自己从列表中删除,我不认为这是非法的。

标签: java arraylist iterator


【解决方案1】:

这是因为某些线程实际上是在 for each 循环中查看此列表,也许您正试图在 for-each 的主体中删除此列表的元素?您不能在 for-each 中删除元素,但可以在迭代器循环中:

您可以使用迭代器而不是 for each 来删除和查看列表中的元素,如下所示:

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

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

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

【讨论】:

    【解决方案2】:

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

    iterator.remove();
    

    Java Docs 中说:

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

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

    【讨论】:

    • 我知道这一点,但我需要在这种情况下如何使用它。
    • 如果您可以在问题中提供更多的代码 sn-ps 以获得适当的答案;否则很难将这些知识应用于您的情况。
    【解决方案3】:

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

    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

    【讨论】:

      【解决方案4】:
      Iterator<Integer> itr = yourlist.iterator();
      
      // remove all even numbers
      while (itr.hasNext()) {
             itr.remove();
      }
      

      这必须为您工作,解决此问题的其他方法是使用 CopyOnWriteArrayList 希望它有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-21
        • 2013-01-26
        • 1970-01-01
        • 1970-01-01
        • 2021-03-11
        • 2020-08-23
        • 1970-01-01
        • 2015-08-02
        相关资源
        最近更新 更多