Picture Picture Picture Picture Picture Picture Picture

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 it = myList.iterator(); it.hasNext()😉 {
String value = it.next();
if (value.equals( "3")) {
it.remove(); // ok
}
}
System. out.println( "List Value:" + myList.toString());

// 2 建一个集合,记录需要删除的元素,之后统一删除
List templist = new ArrayList();
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 = new CopyOnWriteArrayList();
myList.add( "1");
myList.add( "2");
myList.add( "3");
myList.add( "4");
myList.add( "5");

Iterator it = myList.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 来进行下表移动

posted @ 2020-07-10 15:30  云行雨步  阅读(128)  评论(0编辑  收藏  举报
Title - Artist
0:00