List集合在遍历时删除数据的问题
关于集合遍历时,删除数据可能会发生的一些问题
首先创建一个含有20个Integer类型的元素的集合
ArrayList<Integer> arrayList = new ArrayList<>();
for (int i = 0; i < 20; i++) {arrayList.add(Integer.valueOf(i));
}
下面分几种循环遍历的方式来删除集合中的元素
1.
Iterator<Integer> iterator = arrayList.iterator();
while (iterator.hasNext()) {Integer integer = iterator.next();if (integer.intValue() == 5) {arrayList.remove(integer);}
}
System.out.println(arrayList);
以上代码执行后,会报错java.util.ConcurrentModificationException
原因:ArrayList中的存在remove方法,remove方法执行后,会有将ArrayList中的modCount自增1,ArrayList中的内部类Iterator中也有remove方法,内部类中有expectedModCount字段,内部类中的remove方法先调用ArrayList中的remove方法,modCount自增1后,将modCount的值赋给expectedModCount,使二者相等,所以在调用next方法,校验二者的大小时,不会发生报错;如果像上述代码中,在遍历的时候用集合对象删除元素,会发生报错,可以使用迭代器来删除。
Iterator<Integer> iterator = arrayList.iterator();while (iterator.hasNext()) {Integer integer = iterator.next();if (integer.intValue() == 5) {iterator.remove();}}
2.使用增强for循环来删除元素
iterator = arrayList.iterator();
for (Integer value : arrayList) {Integer integer = iterator.next();if (integer.intValue() == 5) {arrayList.remove(integer);}
}
使用增强for循环会同样会造成ConCurrentModificationException3.使用普通的for循环来删除元素
for (int i = 0; i< arrayList.size(); i++){arrayList.remove(5);
}
System.out.println(arrayList);
使用这种循环来删除元素,不会报错
但是呢,由于List集合的实现类是ArrayList,删除一个元素,会造成arrayList.size()的大小减1,删除元素会造成arrayList中,被删除元素之后的所有的元素都向前移动1,例如,删除位置在5的元素,处在第六位的元素会前进一个位置,遍历第六位的时候,其实取到的是之前处在第七位的元素,这样就漏掉了之前处在第六位的元素,最终可能会导致结果与预期的结果不符。
参考文章:https://www.cnblogs.com/snowater/p/8024776.html
List集合在遍历时删除数据的问题相关推荐
- List如何在遍历时删除元素
背景:业务中经常会涉及遍历list时对集合进行插入或者删除操作 一. 错误方式 先看看下面几段代码,1是foreach的方式去遍历list并删除元素,2是用迭代器的方式遍历list并删除元素,3是下标 ...
- List遍历时删除与迭代器(Iterator)解惑
文章目录 ArrayList 遍历时删除方法 for循环向后遍历的陷阱 增强型for循环(foreach)遇到的问题 使用迭代器进行遍历同时修改操作 iterator调用remove()方法为什么要先 ...
- go语言map遍历时删除是安全的, 且可以完全删除
结论: map遍历时删除操作是完全的,且可以完全删除指定的元素 实验结果如下图: 代码如下: package main import ("fmt" ) func main() {x ...
- go语言 sync.map遍历时删除可以全部删除
结论: sync.map遍历时删除操作是完全的,且可以完全删除指定的元素 实验结果下图: 代码如下: package mainimport ("fmt""sync&quo ...
- vector, list, map在遍历时删除符合条件的元素
直接看源码,内有详细解释 /* 测试vector, list, map遍历时删除符合条件的元素 本代码测试环境: ubuntu12 + win7_x64 */ #include <iostrea ...
- Python_遍历时删除的处理说明
遍历时,建议不能直接进行remove删除,会跳过某些元素 实例: a=[1,2,3,4,5] for i in a: a.remove(i) print a a=[1,2,3,4,5] for i i ...
- Map遍历时删除元素
package ee;import java.util.HashMap; import java.util.Iterator;public class Demo {public static void ...
- java遍历list删除数据,遍历删除List中的元素方法
red hat enterprise linux 8到图书 129.9元 (需用券) 去购买 > 1.通过增强的for循环删除符合条件的多个元素 /** * 使用增强的for循环 * 在循环过程 ...
- C++容器遍历时删除元素
vector 错误做法 这样做会在遍历过程中越界导致程序崩溃 std::vector<int> vecInt({ 1, 3, 2, 1, 4, 1 });for (auto i = vec ...
- Kotlin list在遍历时删除元素方法汇总
方法一:Iterator迭代器 val list = arrayListOf("1", "2", "3", "4", & ...
最新文章
- JavaWeb监听器
- 库卡机器人CELL程序解析
- UNITY3D 脑袋顶血顶名
- LeetCode 2053. 数组中第 K 个独一无二的字符串(哈希)
- python中search和match的区别_Python中正则表达式match()、search()函数及match()和search()的区别详解...
- iOS build Version 作用
- Intel的新玩法:固态硬盘也超频
- 学计算机逻辑思维能力测试题,逻辑思维题(逻辑思维能力测试20题)
- 微信公众号插入公式介绍
- 报刊资料整理:云安全(cloud security)
- 牛客网高级项目课总结
- 比较两组数据的差异用什么图更直观_第四节 单因素完全随机实验设计及数据处理...
- 从零开始学习CANoe(二)—— CANdb++ 创建 dbc文件
- 抽取MySQL数据成文件_MySql导入和抽取大数量级文件数据
- 经济学论文素材之美国浮动汇率制度
- html编辑器的回车换行问题解决方案
- 技巧_MFC_标题栏背景
- 大数据概论 (理论基础)
- 《腾讯云CityBase产品白皮书》
- 古风摄影《月华淡1》之华一