ArrayList循环删除报错Exception in thread “main“ java.util.ConcurrentModificationException

Posted 花伤情犹在

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayList循环删除报错Exception in thread “main“ java.util.ConcurrentModificationException相关的知识,希望对你有一定的参考价值。

前言

本文介绍2种循环报错情况

  1. foreach(注意:是增强for循环,不是普通的for循环)
  2. Iterator(迭代器)

foreach报错:

示例代码:

import java.util.ArrayList;

public class TestArray {
    public static void main(String[] args) {
        ArrayList<String> arrayList=new ArrayList<String>();
        arrayList.add("11");
        arrayList.add("22");
        arrayList.add("33");
        arrayList.add("44");
        arrayList.add("55");
        for (String string : arrayList) {
            if (string=="11"){
                arrayList.remove(string);
            }
        }
        System.out.println(arrayList);
    }
}

代码讲解:

  • 定义String类型的ArrayList集合
  • 往ArrayList中添5组字符串(“11”,“22”,“33”.“44”.“55”)
  • 用增强for循环(foreach)对ArrayList进行遍历,在遍历的时候判断当前所的的字符串是否为"11"
  • 如果当前所遍历的字符串是"11",就从ArrayList中将其删除

运行结果:

Exception in thread "main" java.util.ConcurrentModificationException
	at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1012)
	at java.base/java.util.ArrayList$Itr.next(ArrayList.java:966)
	at TestArray.main(TestArray.java:12)

报错
在这里插入图片描述

foreach报错解决:

报错原因:
foreach循环其实就是根据list对象创建一个Iterator迭代对象,用这个迭代对象来遍历list,相当于list对象中元素的遍历托管给了Iterator,你如果要对list进行增删操作,都必须经过Iterator,否则Iterator遍历时会乱,所以直接对list进行删除时,Iterator会抛出ConcurrentModificationException异常
foreach迭代的时候都有2步操作:

  1. iterator.hasNext() //判断是否有下个元素
  2. string= iterator.next() //获取下个元素的值,并赋值给上面例子中的string变量

解决方法:

  1. 不用增强for循环(foreach),用普通for循环遍历,用集合的arrayList.remove()方法删除
  2. 用迭代器自带的iterator.remove();方法
  3. 在删除之后立刻用break结束循环语句

使用break语结束循环语句就不会报错
在这里插入图片描述

Iterator报错:

示例代码:

import java.util.ArrayList;
import java.util.Iterator;

public class TestArray {
    public static void main(String[] args) {
        ArrayList<String> arrayList=new ArrayList<String>();
        arrayList.add("11");
        arrayList.add("22");
        arrayList.add("33");
        arrayList.add("44");
        arrayList.add("55");
        Iterator<String> iterator=arrayList.iterator();
        while (iterator.hasNext()){
            String string=iterator.next();
            if (string=="11"){
                arrayList.remove(string);
            }
        }
        System.out.println(arrayList);
    }
}

代码讲解:

  • 定义String类型的ArrayList集合
  • 往ArrayList中添5组字符串(“11”,“22”,“33”.“44”.“55”)
  • 使用Iterator迭代器对ArrayList进行遍历,在遍历的时候判断当前所的的字符串是否为"11"
  • 如果当前所遍历的字符串是"11",就从ArrayList中将其删除

运行结果:

[Exception in thread "main" java.util.ConcurrentModificationException
	at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1012)
	at java.base/java.util.ArrayList$Itr.next(ArrayList.java:966)
	at TestArray.main(TestArray.java:15)

报错
在这里插入图片描述

Iterator报错解决:

报错原因:

如果要对list进行增删操作,都必须经过Iterator,否则Iterator遍历时会乱,所以直接对list进行删除时,Iterator会抛出ConcurrentModificationException异常

解决方法:

  • 不用Iterator迭代器,用for循环遍历,用集合的arrayList.remove()方法删除
  • 用迭代器自带的iterator.remove();方法

用迭代器自带的iterator.remove();方法就不会报错
在这里插入图片描述

以上是关于ArrayList循环删除报错Exception in thread “main“ java.util.ConcurrentModificationException的主要内容,如果未能解决你的问题,请参考以下文章

集合循环删除问题-报错java.util.ConcurrentModificationException解析

ArrayList在foreach正常迭代删除不报错的原因

ArrayList循环删除元素的常见问题及解决方法

ArrayList循环删除元素的常见问题及解决方法

ArrayList循环删除元素的常见问题及解决方法

ArrayList循环遍历并删除元素的常见陷阱