ArrayList循环删除报错Exception in thread “main“ java.util.ConcurrentModificationException
Posted 花伤情犹在
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayList循环删除报错Exception in thread “main“ java.util.ConcurrentModificationException相关的知识,希望对你有一定的参考价值。
前言
本文介绍2种循环报错情况
- foreach(
注意:是增强for循环,不是普通的for循环
) - 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步操作:
- iterator.hasNext() //判断是否有下个元素
- string= iterator.next() //获取下个元素的值,并赋值给上面例子中的string变量
解决方法:
- 不用增强for循环(
foreach
),用普通for循环遍历,用集合的arrayList.remove()方法删除 - 用迭代器自带的iterator.remove();方法
- 在删除之后立刻用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的主要内容,如果未能解决你的问题,请参考以下文章