我有一个具有静态对象ArrayList的ClassA
public static ArrayList meteorits = new ArrayList();
现在我要像这样从列表中删除一个对象
ClassA.meteorits.remove(this);
这是用Meteorit类编写的。 但是,当我想使用ArrayList中的对象时,它将引发异常。
我使用Iterator从ArrayList中删除对象,但是现在我不知道如何在这种情况下使用它。
迭代时从集合中移除元素的可能重复项
为什么ArrayList static? 我建议完全像observer设计模式那样做。 首先,在ClassA中创建一个称为public removeMetorit(Meteorit meteorit)的方法,并在Meteorit类之外的任何地方使用它。
另外,您正在从要删除的对象内部调用remove方法,这是非法的。
我希望陨石从列表中删除,我不认为它是非法的。
这是因为某个线程实际上正在for每个循环中查看此列表,也许您尝试在for每个循环的主体中删除此列表的元素?您不能删除每个元素中的元素,但是可以在迭代器循环中:
您可以使用迭代器代替每个迭代器来删除和查看列表中的元素,如下所示:
public static ArrayList meteorits = new ArrayList();
Iterator itr = meteorits.iterator();
while (itr.hasNext()) {
if (itr.next()==this) {
itr.remove();
}
}
这帮助了我,谢谢大家!!!
基本上,您需要使用迭代器来避免此类并发修改:
List list = new ArrayList<>();
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
String string = iterator.next();
if (string.isEmpty()) {
iterator.remove();
}
}
有关更多详细信息,请查看此帖子:
遍历Collection,避免在循环中删除时避免ConcurrentModificationException
使用迭代器时;您需要使用迭代器使用以下方法从列表中删除项目:
iterator.remove();
Java Docs中的说明:
Removes from the underlying collection the last element returned by this iterator.
通过任何其他方式从列表中删除项目将导致您看到的ConcurrentModificationException。
我知道这一点,但是在这种情况下,我需要如何使用它的方式。
如果您可以在问题中提供更多代码片段,以便获得适当的答案; 否则很难将这种知识应用于您的情况。
Iterator itr = yourlist.iterator();
// remove all even numbers
while (itr.hasNext()) {
itr.remove();
}
这必须为您工作,解决此问题的另一种方法是使用CopyOnWriteArrayList希望对您有所帮助。