首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在遍历和删除ArrayList中的元素时避免java.util.ConcurrentModificationException

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

Stack Overflow用户
提问于 2011-11-12 21:22:40
回答 17查看 412.9K关注 0票数 250

我有一个想要迭代的ArrayList。当我迭代它的时候,我必须同时删除元素。显然,这会抛出一个java.util.ConcurrentModificationException

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

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

我的代码如下所示:

代码语言:javascript
复制
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()

EN

回答 17

Stack Overflow用户

发布于 2016-08-24 18:19:12

您正在尝试从高级"for loop“中删除列表中的值,这是不可能的,即使您应用了任何技巧(您在代码中就是这样做的)。更好的方法是按照这里的建议编写迭代器级别的代码。

我想知道为什么人们没有建议使用传统的for循环方法。

代码语言:javascript
复制
for( int i = 0; i < lStringList.size(); i++ )
{
    String lValue = lStringList.get( i );
    if(lValue.equals("_Not_Required"))
    {
         lStringList.remove(lValue);
         i--; 
    }  
}

这也是可行的。

票数 20
EN

Stack Overflow用户

发布于 2017-03-05 18:54:12

在Java8中,您可以使用Collection接口,并通过调用removeIf方法来完成此操作:

代码语言:javascript
复制
yourList.removeIf((A a) -> a.value == 2);

欲获知更多信息,请访问here

票数 16
EN

Stack Overflow用户

发布于 2017-01-23 07:27:52

您真的应该以传统的方式迭代回数组。

每次从列表中删除一个元素时,后面的元素都会被前移。只要您不更改除迭代元素之外的其他元素,下面的代码就应该可以工作。

代码语言:javascript
复制
public class Test(){
    private ArrayList<A> abc = new ArrayList<A>();

    public void doStuff(){
        for(int i = (abc.size() - 1); i >= 0; i--) 
            abc.get(i).doSomething();
    }

    public void removeA(A a){
        abc.remove(a);
    }
}
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8104692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档