arrayList 和 linkedList 的实现里 都一个 modCount 这个遍历。 对于arrayList,在调用remove 和 clean 方法的时候,会修改 modCount 这个变量的值。在遍历的时候这个值被修改了。就会报错 抛出 java.util.ConcurrentModificationException 这个异常
代码中看一下
//初始一个list
List<Integer> list = new ArrayList<>();
//给list 添加数据
for(int i=0;i<8;i++){
list.add(i);
}
//打印一下他的长度
System.out.println("原list长度"+list.size());
//捕获下异常
try{
//遍历操作数据
for(int li:list){
//s随便删一条数据,改变一下他的长度
list.remove(1);
System.out.println("改变后的长度"+list.size());
}
}catch (Exception e){
System.err.println(e);
}
看下输出结果
程序在第一次遍历是可以正常运行,当第二次运行时,原list的长度别改变,则会 抛出 java.util.ConcurrentModificationException
你非要去改变他的size时 可以重新实例一个List 然后 通过判断 装进新的list里
//初始一个list
List<Integer> list = new ArrayList<>();
//给list 添加数据
for(int i=0;i<8;i++){
list.add(i);
}
System.out.println("原list长度"+list.size());
try{
//遍历操作数据
List<Integer> list1 = new ArrayList<>();
for(int li:list){
// //s随便删一条数据,改变一下他的长度
// list.remove(1);
if(li == 3){
list1.add(li);
System.out.println(list1);
}
}
System.out.println("程序运行结束");
}catch (Exception e){
System.err.println(e);
}
看下输出结果
好了,就简单分析到这,要想更清楚的了解,可以看看底层源码以及他的父类