2020-7-10 数组遍历时候remove报 ConcurrentModificationException
出现问题了
今天在写一个递归代码循环arrylist的时候 出现了问题,报了ConcurrentModificationException这个异常。
代码如下:
功能描述
上网查资料
网上找到的原因如下
方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
案列如下:
public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("11"); for (String str : list) { if (str.equals("11")) list.remove(str); } }
通俗点解释:其实就是循环的时候 执行了remove 然后数组下表改变了,所以遍历出现了问题
解决方案
`
// 1 使用Iterator提供的remove方法,用于删除当前元素
for (Iterator
String value = it.next();
if (value.equals( "3")) {
it.remove(); // ok
}
}
System. out.println( "List Value:" + myList.toString());
// 2 建一个集合,记录需要删除的元素,之后统一删除
List
for (String value : myList) {
if (value.equals( "3")) {
templist.remove(value);
}
}
// 可以查看removeAll源码,其中使用Iterator进行遍历
myList.removeAll(templist);
System. out.println( "List Value:" + myList.toString());
// 3. 使用线程安全CopyOnWriteArrayList进行删除操作
List
myList.add( "1");
myList.add( "2");
myList.add( "3");
myList.add( "4");
myList.add( "5");
Iterator
while (it.hasNext()) {
String value = it.next();
if (value.equals( "3")) {
myList.remove( "4");
myList.add( "6");
myList.add( "7");
}
}
System. out.println( "List Value:" + myList.toString());
// 4. 不使用Iterator进行遍历,需要注意的是自己保证索引正常
for ( int i = 0; i < myList.size(); i++) {
String value = myList.get(i);
System. out.println( "List Value:" + value);
if (value.equals( "3")) {
myList.remove(value); // ok
i--; // 因为位置发生改变,所以必须修改i的位置
}
}
System. out.println( "List Value:" + myList.toString());
`
我的选择
我使用最后一种 比较好理解 以前修改的地方很少
我在递归的同时如果使用了 remove 但是没有使用add 那么就返回true 来进行下表移动