在迭代和从ArrayList中删除元素时,如何避免java.util.Concurrent

在迭代和从ArrayList中删除元素时,如何避免java.util.ConcurrentModificationException

我有一个我想迭代的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();


万千封印
浏览 378回答 3
3回答

慕码人2483693

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

泛舟湖上清波郎朗

来自ArrayList的JavaDocs此类的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出ConcurrentModificationException。

拉丁的传说

您试图从高级“for循环”中的列表中删除值,这是不可能的,即使您应用任何技巧(您在代码中执行)。更好的方法是将迭代器级别编码为其他建议。我想知道人们怎么没有建议传统的for循环方法。for(&nbsp;int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;lStringList.size();&nbsp;i++&nbsp;){ &nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;lValue&nbsp;=&nbsp;lStringList.get(&nbsp;i&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;if(lValue.equals("_Not_Required")) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lStringList.remove(lValue); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i--;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;}这也有效。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java