一、ConcurrentModificationException【并发修改异常】
产生原因:迭代器遍历过程中,使用集合对象对当前集合元素进行修改操作
错误代码实例:
package com.tlc.gather;
import java.util.ArrayList;
import java.util.Iterator;
public class ConcurrentModificationExceptionDemo {
public static void main(String[] args) {
//创建一个集合
ArrayList<Integer> list = new ArrayList<>();
//添加几个元素
list.add(123);
list.add(345);
list.add(567);
//System.out.println(list);
Method(list);
}
public static void Method(ArrayList<Integer> list) {
//获取迭代器对象
Iterator<Integer> iter = list.iterator();
while(iter.hasNext()) {
Integer num = iter.next();
//此处在遍历过程中,由于对用集合对象对集合元素进行修改会导致报错
list.add(520);
}
}
}
错误信息:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at com.tlc.gather.ConcurrentModificationExceptionDemo.Method(ConcurrentModificationExceptionDemo.java:22)
at com.tlc.gather.ConcurrentModificationExceptionDemo.main(ConcurrentModificationExceptionDemo.java:15)
解决方法:
1.不使用迭代器遍历;
2.使用迭代器对象进行修改操作;
Iterator类型的迭代器:只能删除不能增加 适用于所有的单列集合
ListIterator类型的迭代器:只适用于List集合中吗,添加和删除
迭代器遍历对集合修改的实例【其他遍历方式修改元素非常简单就不一一列举了】
//获取迭代器对象
//Iterator<Integer> iter = list.iterator();
ListIterator<Integer> li = list.listIterator();
while(li.hasNext()) {
Integer num = li.next();
//此处在遍历过程中,由于对用集合对象对集合元素进行修改会导致报错
//list.add(520);
if(num == 123) {
//iterator只具有删除方法
//iter.remove();
//ListIterator有添加和删除方法
//li.remove();
li.add(899);
}
}
以上部分如有错误,欢迎评论区大佬指点。