这是一个java程序员迈向成功必定踩过的坑,在集合中循环remove,应如何避免?
首先上出错代码
用增强版for循环
public static void main(String [] args){
List<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.add(4);
arrayList.add(5);
//利用增强版for循环进行删除
for(Integer array:arrayList){
if(array>2){
arrayList.remove(array);
}
}
//异常
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at TestInterface1.main(TestInterface1.java:16)
//普通for循环
List<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(10);
arrayList.add(20);
arrayList.add(30);
arrayList.add(40);
arrayList.add(50);
//进行删除
for(int j =0 ;j<arrayList.size();j++){
if(arrayList.get(j)>20){
arrayList.remove(j);
}
}
//输出
for(Integer array:arrayList){
System.out.println(array);
}
//结果
10 20 40
增强版说异常信息说并发修改异常?小伙伴一下就慌了,
用普通版删除不报错但是,看结果是认真的吗?大于20的都应该被删除啊。
下面用正确的方法
1.迭代器
//迭代器进行删除
Iterator<Integer> iter = arrayList.iterator();
while(iter.hasNext()){
if(iter.next()>20){
iter.remove();
}
}
//输出
for(Integer array:arrayList){
System.out.println(array);
}
//结果
10 20
小伙伴们肯定觉得很奇怪,为什么前两种不行?
- 第一种不行的原因在于当删除一个元素时,下标已经发生了变化,控制符i已经不好使,不理解的看这段代码
List<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(10);
arrayList.add(20);
arrayList.add(30);
arrayList.add(40);
arrayList.add(50);
//迭代器进行删除
for(int i= 0;i<arrayList.size();i++){
if(arrayList.get(i)>20){
arrayList.remove(i);
//删除之后集合的原有位置发生变化,只能让i减减进行获取元素
i--;
}
}
//输出
for(Integer array:arrayList){
System.out.println(array);
}
//结果 10 20
- 增强版fou循环不行的原因为, 增强版for循环内部采用的是迭代器实现的,但在对元素删除时,其实用的是ArrayList的remove方法,故会产生并发修改异常,如图
iter.remove();为迭代器删除时所用删除方法
arrayList.remove(array);用增强版for循环时调用的删除方法,这个删除方法是来源与ArrayList的删除方法。
至此 为什么不能在集合中循环删除或添加 到此结束,如有不对,望提醒
热门评论
欢迎大家指正