转载自 Java码农必须掌握的循环删除List元素的正确方法

首先看下下面的各种删除list元素的例子

public static void main(String[] args) {List<String> list = new ArrayList<>(Arrays.asList("a1", "ab2", "a3", "ab4", "a5", "ab6", "a7", "ab8", "a9"));/*** 报错* java.util.ConcurrentModificationException*/for (String str : list) {if (str.contains("b")) {list.remove(str);}}/*** 报错:下标越界* java.lang.IndexOutOfBoundsException*/int size = list.size();for (int i = 0; i < size; i++) {String str = list.get(i);if (str.contains("b")) {list.remove(i);}}/*** 正常删除,每次调用size方法,损耗性能,不推荐*/for (int i = 0; i < list.size(); i++) {String str = list.get(i);if (str.contains("b")) {list.remove(i);}}/*** 正常删除,推荐使用*/for (Iterator<String> ite = list.iterator(); ite.hasNext();) {String str = ite.next();if (str.contains("b")) {ite.remove();}}/*** 报错* java.util.ConcurrentModificationException*/for (Iterator<String> ite = list.iterator(); ite.hasNext();) {String str = ite.next();if (str.contains("b")) {list.remove(str);}}}

报异常IndexOutOfBoundsException我们很理解,是动态删除了元素导致数组下标越界了。

那ConcurrentModificationException呢?

其中,for(xx in xx)是增强的for循环,即迭代器Iterator的加强实现,其内部是调用的Iterator的方法,为什么会报ConcurrentModificationException错误,我们来看下源码

取下个元素的时候都会去判断要修改的数量和期待修改的数量是否一致,不一致则会报错,而通过迭代器本身调用remove方法则不会有这个问题,因为它删除的时候会把这两个数量同步。搞清楚它是增加的for循环就不难理解其中的奥秘了。

Java码农必须掌握的循环删除List元素的正确方法相关推荐

  1. Java码农进阶之路~构造方法静态与成员变量及方法

    一 构造方法 当你在这个类中没有提供无参的构造方法的时候,系统会在你创建对象的时候,也会调用无参的构造,而这个无参方法,系统会帮你提供一个. 如果你只是提供了有参的构造方法,那么系统将不再给你提供 无 ...

  2. 高级JAVA码农必须搞清楚它们的区别:instanceof、isInstance、isAssignableFrom

    转载自 高级JAVA码农必须搞清楚它们的区别:instanceof.isInstance.isAssignableFrom instanceof.isInstance.isAssignableFrom ...

  3. java码农笔记本_Java 码农,准备换一台电脑, MBP 还是 ThinkPad?

    Java 码农,考虑笔记本电脑,黑五到了准备在 T480s 和 mbp2018 13 英寸中选择. 需求: 1.主要是码代码,IDEA/Eclipse/MyEclipse 等集成开发工具. 2.轻度办 ...

  4. 程序员迷茫:30岁以上的“大龄程码农”出路在哪?java码农该怎么办?

    程序员生存.成功.制胜的法则 源自IT精英的职业发展秘诀 热爱工作,享受生活 为什么程序员过了30就不行了? 我们被固定在"敲代码"的坑里,一干就是10年,再干别的早已不会.敲代码 ...

  5. java map循环删除_map循环删除某个元素

    下面代码展示了遍历Map时删除元素的正确方式和错误方式. import java.util.HashMap; import java.util.Iterator; import java.util.M ...

  6. Java码农怎样才能成为年薪60W的高级架构师进入BAT?

    怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名遭到BAT疯抢的架构师. 那么遭到BAT疯抢的架构师应该有怎样的技术知识体系,这不仅是一个刚刚踏入职场的初级程序员也是工作三五年之 ...

  7. js array 删除指定元素_Array 原型方法源码实现解密

    作者:木易杨 引言 今天这篇文章主要看看 ECMA-262 规范中是如何定义这些方法的,并且在看完规范后我们用 JS 模拟实现下,透过源码探索一些底层的知识,希望本文对你有所帮助. Array.pro ...

  8. Selenium 循环删除页面元素

    之所以不能用for 循环删除的原因是元素删除后页面会重新渲染; 取出所有的元素,使用while循环依次删除数组里的第一个元素,直到全部删除 from selenium import webdriver ...

  9. c++循环删除map元素

    写c++循环删除map,list等元素时,需要注意的细节: // 这里的调用是在同一个线程里的,所以这里不用考虑互斥处理.tagRtspData* item = NULL;map<SSocket ...

最新文章

  1. leangoo领歌敏捷开发工具新增任务到期提醒功能
  2. 客户机不能看到分配的dhcp_交换机配置DHCP后下挂用户获取不到IP地址或者获取缓慢...
  3. spring boot+shiro中使用@RequiresRoles不生效,访问报错404
  4. SQL优化理解的一点方法
  5. php课程---JavaScript与Jquery的区别(转)
  6. laravel--模型中各种属性详解
  7. php ttc转ttf 在线,iPad字体字库与Windows字库互相转换
  8. c语言用循环转换单词首字母,用c++实现将文本每个单词首字母转换为大写
  9. 新辰:雕爷与张朝阳分享创业感悟 给90后创业者打鸡血共勉
  10. 华为薪资等级结构表_华为公司等级薪酬制度
  11. 页面添加蒙版,但是不影响页面其他事件响应
  12. python读取excel一行一行的读取_python读取excel数据
  13. Windows引导过程(BIOS,UEFI)
  14. ABAP ALV DATA_CHANGED 函数使用说明 (ALV备忘二)
  15. python学习(二)
  16. SQL语句和sql函数
  17. html页面统计在线人数,统计在线人数couter
  18. android课程设计致谢,有关课程设计论文的致谢词
  19. C#在Excel与Word中写入上角标与下角标
  20. “3点钟无眠区块链”的前世今生

热门文章

  1. C++实现各种排序以及复杂度,稳定性分析
  2. CSS3动画大全(附源码)flex布局,grid布局3d旋转,图像模糊,文字发光
  3. 机器学习朴素贝叶斯算法+tkinter库界面实现好瓜坏西瓜分类
  4. P4781 【模板】拉格朗日插值
  5. P1527 [国家集训队]矩阵乘法 整体二分 + 二维树状数组
  6. Link-Cut Tree
  7. P1712 [NOI2016]区间
  8. [ZOJ 3203] 灯泡
  9. LOJ洛谷P1248加工生产调度(贪心、Johnson 法则)
  10. 不止代码:合唱队列(动态规划)