关于集合遍历时,删除数据可能会发生的一些问题

首先创建一个含有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集合在遍历时删除数据的问题相关推荐

  1. List如何在遍历时删除元素

    背景:业务中经常会涉及遍历list时对集合进行插入或者删除操作 一. 错误方式 先看看下面几段代码,1是foreach的方式去遍历list并删除元素,2是用迭代器的方式遍历list并删除元素,3是下标 ...

  2. List遍历时删除与迭代器(Iterator)解惑

    文章目录 ArrayList 遍历时删除方法 for循环向后遍历的陷阱 增强型for循环(foreach)遇到的问题 使用迭代器进行遍历同时修改操作 iterator调用remove()方法为什么要先 ...

  3. go语言map遍历时删除是安全的, 且可以完全删除

    结论: map遍历时删除操作是完全的,且可以完全删除指定的元素 实验结果如下图: 代码如下: package main import ("fmt" ) func main() {x ...

  4. go语言 sync.map遍历时删除可以全部删除

    结论: sync.map遍历时删除操作是完全的,且可以完全删除指定的元素 实验结果下图: 代码如下: package mainimport ("fmt""sync&quo ...

  5. vector, list, map在遍历时删除符合条件的元素

    直接看源码,内有详细解释 /* 测试vector, list, map遍历时删除符合条件的元素 本代码测试环境: ubuntu12 + win7_x64 */ #include <iostrea ...

  6. 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 ...

  7. Map遍历时删除元素

    package ee;import java.util.HashMap; import java.util.Iterator;public class Demo {public static void ...

  8. java遍历list删除数据,遍历删除List中的元素方法

    red hat enterprise linux 8到图书 129.9元 (需用券) 去购买 > 1.通过增强的for循环删除符合条件的多个元素 /** * 使用增强的for循环 * 在循环过程 ...

  9. C++容器遍历时删除元素

    vector 错误做法 这样做会在遍历过程中越界导致程序崩溃 std::vector<int> vecInt({ 1, 3, 2, 1, 4, 1 });for (auto i = vec ...

  10. Kotlin list在遍历时删除元素方法汇总

    方法一:Iterator迭代器 val list = arrayListOf("1", "2", "3", "4", & ...

最新文章

  1. JavaWeb监听器
  2. 库卡机器人CELL程序解析
  3. UNITY3D 脑袋顶血顶名
  4. LeetCode 2053. 数组中第 K 个独一无二的字符串(哈希)
  5. python中search和match的区别_Python中正则表达式match()、search()函数及match()和search()的区别详解...
  6. iOS build Version 作用
  7. Intel的新玩法:固态硬盘也超频
  8. 学计算机逻辑思维能力测试题,逻辑思维题(逻辑思维能力测试20题)
  9. 微信公众号插入公式介绍
  10. 报刊资料整理:云安全(cloud security)
  11. 牛客网高级项目课总结
  12. 比较两组数据的差异用什么图更直观_第四节 单因素完全随机实验设计及数据处理...
  13. 从零开始学习CANoe(二)—— CANdb++ 创建 dbc文件
  14. 抽取MySQL数据成文件_MySql导入和抽取大数量级文件数据
  15. 经济学论文素材之美国浮动汇率制度
  16. html编辑器的回车换行问题解决方案
  17. 技巧_MFC_标题栏背景
  18. 大数据概论 (理论基础)
  19. 《腾讯云CityBase产品白皮书》
  20. 古风摄影《月华淡1》之华一

热门文章

  1. 计算机网络之奈奎斯特定理和香农定理
  2. js 身份证 正则校验 大陆、香港、澳门、台湾 身份证 正则校验
  3. Golang 实现定时任务
  4. 流失用户召回方法策略,教你如何挽回流失用户
  5. 图解LDO电路和DC-DC电路,掌握芯片选型
  6. git 基础命令大全
  7. qt轻松实现不规则按钮
  8. 【收藏】通信知识分类整理
  9. EasyBCD and UEFI
  10. 利率里面的BP是什么意思,bp是什么意思贷款利率