当前位置: 首页 > 面试题库 >

在遍历和删除ArrayList中的元素时如何避免java.util.ConcurrentModificationException

戈正初
2023-03-14
问题内容

我有一个要迭代的ArrayList。遍历它时,我必须同时删除元素。显然,这引发了java.util.ConcurrentModificationException

解决此问题的最佳实践是什么?我应该先克隆列表吗?

我删除的不是循环本身的元素,而是代码的另一部分。

我的代码如下所示:

public class Test() {
    private ArrayList<A> abc = new ArrayList<A>();

    public void doStuff() {
        for (A a : abc) 
        a.doSomething();
    }

    public void removeA(A a) {
        abc.remove(a);
    }
}

a.doSomething可能打电话Test.removeA();


问题答案:

两种选择:

  • 创建要删除的值的列表,将其添加到循环中的列表中,然后originalList.removeAll(valuesToRemove)在最后调用
  • remove()在迭代器本身上使用该方法。请注意,这意味着你不能使用增强的for循环。
    作为第二个选项的示例,从列表中删除任何长度大于5的字符串:
List<String> list = new ArrayList<String>();
...
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
    String value = iterator.next();
    if (value.length() > 5) {
        iterator.remove();
    }
}


 类似资料:
  • 问题内容: 我正在尝试从这样的迭代中删除一些元素: 当然,当我尝试同时从列表中删除项目时,我会得到一个提示。有解决此问题的简单方法吗? 问题答案: 使用和致电:

  • 问题内容: 我的页面包含一堆表格。我在外循环中遍历表,然后在内循环中遍历表中的每一行。一切正常。但是某些页面具有“下一步”按钮。当我在完成页面后添加代码以单击该代码时,则在遍历表的各行时开始获取StaleElementReferenceException。 这是代码: 我不明白的是,为什么过时的因素根本没有发生?该页面在循环过程中没有更改,我一直等到所有元素都提取完之后。如何避免StaleElem

  • 问题内容: 我们都知道您由于以下原因而无法执行以下操作: 但这显然有时有效,但并非总是如此。这是一些特定的代码: 当然,这导致: 即使没有多个线程。无论如何。 解决此问题的最佳方法是什么?如何在不引发此异常的情况下循环地从集合中删除项目? 我还在这里使用任意值,不一定是an t,因此您不能依赖。 问题答案: 是安全的,您可以这样使用它: 注意,这是在迭代过程中修改集合的唯一安全方法。如果在进行迭代

  • 问题内容: 在java中当遍历一个集合时,删除元素如何避免发生ConcurrentModificationException异常? 问题答案: 1576 是安全的,可以这样使用: 注意,这Iterator.remove()是在迭代过程中修改集合的唯一安全方法。如果在进行迭代时以任何其他方式修改了基础集合,则行为未指定。 同样,如果您有个并想要添加项目,则可以使用,出于相同的原因 ,它可以允许使用。

  • 问题内容: 在Java中,我可以通过使用an ,然后使用迭代器的方法来删除迭代器返回的最后一个元素,如下所示: 我将如何在Python中执行此操作?我在for循环中遍历列表时无法修改列表,因为它会导致内容被跳过(请参阅此处)。而且似乎没有Java的等效接口。 问题答案: 遍历列表的 副本 :

  • 问题内容: 我正在尝试一个练习,在该练习中,我将1000个元素添加到arraylist中,然后再次从列表中系统地删除它们(通过指定索引)。其背后的想法是比较LinkedList和ArrayList的性能。 如果我执行以下操作,那么只有一半的元素会被删除…为什么呢? 亲切的问候阿里安 问题答案: 发生这种情况是因为您要通过删除来更改索引。如果删除元素0,则元素1现在变为元素0。现在,当您下次删除1时