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)

报错
ArrayList循环删除报错Exception in thread “main“ java.util.ConcurrentModificationException_第1张图片

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语结束循环语句就不会报错
ArrayList循环删除报错Exception in thread “main“ java.util.ConcurrentModificationException_第2张图片

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)

报错
ArrayList循环删除报错Exception in thread “main“ java.util.ConcurrentModificationException_第3张图片

Iterator报错解决:

报错原因:

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

解决方法:

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

用迭代器自带的iterator.remove();方法就不会报错
ArrayList循环删除报错Exception in thread “main“ java.util.ConcurrentModificationException_第4张图片

  • 相关视频讲解-网盘[提取码:a93g]
  • 相关讲解视频-B站

你可能感兴趣的:(Java,ArrayList,Java,迭代器,foreach,for循环)