在迭代和从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();
3 回答

慕码人2483693
TA贡献1860条经验 获得超9个赞
两种选择:
创建要删除的值列表,在循环中添加该列表,然后
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(); }}

泛舟湖上清波郎朗
TA贡献1818条经验 获得超3个赞
来自ArrayList的JavaDocs
此类的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出ConcurrentModificationException。

拉丁的传说
TA贡献1789条经验 获得超8个赞
您试图从高级“for循环”中的列表中删除值,这是不可能的,即使您应用任何技巧(您在代码中执行)。更好的方法是将迭代器级别编码为其他建议。
我想知道人们怎么没有建议传统的for循环方法。
for( int i = 0; i < lStringList.size(); i++ ){ String lValue = lStringList.get( i ); if(lValue.equals("_Not_Required")) { lStringList.remove(lValue); i--; } }
这也有效。
添加回答
举报
0/150
提交
取消