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();方法就不会报错
在这里插入图片描述

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花伤情犹在

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值