在工作中我们经常需要在遍历集合的时候删除元素,一开始我也以为只要在增强for循环中remove元素就可以了,现实给了我一个巴掌那就是ConcurrentModificationException

首先我们创建一个实体类

public class User {private String name;private String adree;public User(String name, String adree) {this.name = name;this.adree = adree;}
}

然后我们创建一个入口用来看看我们怎么在循环中删除元素会出现ConcurrentModificationException异常

public static void main(String[] args) {List<User> list = new ArrayList<>();for (int i = 0; i < 100; i++) {User user = new User("佳佳"+i, "江西"+i);list.add(user);}//首先想到的当然是最简便的增强for循环删除元素,然而事与愿违大大的一个异常甩在脸上for(User user:list){if(user.getName().equals("佳佳80")){list.remove(user);}}}

在需要删除集合元素的时候最先想到的就是使用增强for这也是最简便的方式说实在这也是我认为最简便的一个删除元素的方式。然后我得到了一个

我们可以不关注warn但是一定不能忍Exception,我就不明白了为什么出现异常呢,这迫使这我去追凶异常到底是怎么出现的。

那么首先我们查看一下ArrayList.java中的909行

这个地方做了一个比较要是不相等的话就抛出ConcurrentModificationException那么我们确认异常时这里抛出的

然后我们查看ArrayList.java中的859行

咦,这个地方是下一个那是获取元素的时候抛出的异常咯。于是我们在删除元素的地方打断点看看是删除元素的时候抛出的异常还是在循环的时候出现异常的

经过debug运行代码可以确认实在执行list.remove(user) 之后的下一个 for(User user:list)抛出ConcurrentModificationException的。那么我们继续追查下去为什么在执行remove之后modCount != expectedModCount两个变量就不相等了呢。

经过追查我们发现在Arraylist在执行add(user)操作的时候我们给modCount变量进行了++操作

而在for(User user:list)执行的时候我们首先创建了一个Iterator在创建Iterator的时候我们将modCount变量赋值给了expectedModCount

public Iterator<E> iterator() {return new Itr();}/*** An optimized version of AbstractList.Itr*///只截取了部分代码private class Itr implements Iterator<E> {int cursor;       // index of next element to returnint lastRet = -1; // index of last element returned; -1 if no suchint expectedModCount = modCount;}

list执行remove()操作时我们在删除中修改了modeCount变量的值导致变量modeCount与变量expectedModCount值不一致在删除操作之后执行获取下一个元素时出现值不相等的情况从而抛出异常ConcurrentModificationException

下面例举一些能在遍历时候删除元素的方法:

//该方法可以优先的避免因为删除元素之后移位导致的问题for(int i = list.size()-1;i>=0;i--){if(list.get(i).getName().equals("佳佳80")){list.remove(i);}}//最常见的方法删除元素Iterator iterator = list.iterator();while (iterator.hasNext()){User delUser = (User) iterator.next();if(delUser.getName().equals("佳佳80")){iterator.remove();}}

我自己也是一个刚开发一年半的小码农,写博客是为了记录自己工作中和学习到的一些技能。在这里希望得到更多大佬们的指点。

为了方便大家交流也希望大家关注一下微信公众号:java识记

arraylist删除指定元素_【追凶】ArrayList使用增强for遍历删除元素异常ConcurrentModification...相关推荐

  1. python list去重并删除某些元素_使用Python实现list(列表)中的重复元素删除,例如: X= [1,1,2,a,a,[1,2,3]] 去重后:X= 「1,2,a,[1,2...

    题目要求的实质是列表内部元素的去重,有两种思路:第一种,删除的思路,判断列表中的元素是否出现重复,如果有重复,删除重复出现的元素直到剩下最后一个:第二种,添加的思路,新建空列表,将新列表中不包含.原列 ...

  2. java 删除指定字符_字符串删除指定位置字符 JAVA 删除字符串中指定的字符

    <死侍2>有多不按套路出牌? 要CSS布局HTML小编今天和大家分享用到函数的调用. 编制函数fun,其功能是:删除一个字符串中指定的一.问题描述:从键盘输入一个字符串给str和一个字符给 ...

  3. python矩阵中找满足条件的元素_从numpy数组中取出满足条件的元素示例

    例如问题:从 arr 数组中提取所有奇数元素. input:arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) output: #> array([1, ...

  4. 安装java失败删除不掉_问题8:Java程序安装却删除不了怎么办?

    大家在使用手机的时候,通常都会遇到这么一个问题:我的手机安装了程序,怎么想删却删不掉呢?又或者是程序删掉了,图标删不掉.类似的情况再很多平台的手机上都可能出现,今天我们就针对这个问题,给大家介绍一下简 ...

  5. js删除两个集合中共同元素_多个集合中的共同和独特元素

    js删除两个集合中共同元素 本周,我们将暂时中断较高级别的问题和技术文章,以解决我们中许多人可能面临的一些代码问题. 没什么花哨的或太辛苦的,但是有一天它可能会节省您15分钟的时间,偶尔回到基础上也很 ...

  6. java删除有序数组中的重复元素_算法刷刷刷Leetcode第26题删除排序数组中的重复项...

    给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度.不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成.示例 ...

  7. python删除指定行_关于csv:删除python中的特定行和对应文件

    我想删除90%的"转向"值等于0的行.这三个图像都有一个对应的图像文件,中间,左边和右边.我也要删除它们.csv文件如下: 我编写了以下代码,以至少获取转向值为0的文件.我所需要的 ...

  8. python去掉重复内容并按原来次序输出元素_在Python中,从列表中删除重复项以使所有元素在保留顺序时都是唯一的最快的算法是什么?...

    饮歌长啸 使用方法:lst = [8, 8, 9, 9, 7, 15, 15, 2, 20, 13, 2, 24, 6, 11, 7, 12, 4, 10, 18, 13, 23, 11, 3, 11 ...

  9. android 删除文件 代码_代码审计之某系统后台存在任意删除文件

    本文作者:霾 团队交流群:673441920 ----------------------------------------------------------- 前言 POC镇楼!!! POST ...

最新文章

  1. mybatis学习笔记二(接口注解)
  2. 图解ecshop之批量上传与批量处理
  3. c语言创建链表存储10个数,C语言编写的建立单向int链表,连续输入10个结点创建链表,并实现在原链表中插入数字、删除数字、查找数字的功能...
  4. d3js绘制y坐标轴_【ggplot2】 设置坐标轴
  5. 支持乱序执行的RAFT协议 ppt
  6. MySql 性能调优策略
  7. PMP模拟题200道,中英双对照,附答案解析
  8. java 读取pdf表格_在Java中使用tabula提取PDF中的表格数据
  9. CodeForces - 1169D : Neko Performs Cat Furrier Transform(思维)
  10. 爬取淘宝网站的商品数据
  11. linux怎么加块硬盘,如何在Linux下添加第二块scsi硬盘?
  12. 必修三计算机选修三知识点总结,高一数学必修三知识点总结(超实用)
  13. UICC 之 USIM 详解全系列——UICC基础知识介绍
  14. 优秀logo设计解析_优秀logo设计作品及寓意解析,国外精品logo设计图片分享
  15. mysql错误42000_mysql5.7 异常ERROR 1055 (42000)
  16. mysql中常用动词_mysql常用sql语句总结
  17. T23,雄关漫道真如铁,而今迈步还需从头越
  18. 瓦伦达效应:越在意的,就越容易失去
  19. 布尔教育php分享视频,布尔教育jQuery实战视频资料分享
  20. 关于制作基于STM32的指纹打卡器(不完全体)

热门文章

  1. 为什么作为开发人员面试完全是胡说八道
  2. pdm vault 使用_如何使用Key Vault连接器更好地保护Logic Apps中的秘密
  3. vue 设置输入法隐藏_iPhone键盘的12种隐藏用法,超好用!可惜没几个人知道!
  4. 阿里云CentOS-7.2安装mysql
  5. matlab中最接近零的数值
  6. 8个必备的Python GUI库
  7. 处理Redis里的数据
  8. 干货 | ZooKeeper 源码和实践揭秘
  9. Pandas知识点-逻辑运算
  10. 有关l2,1范数作用的理解--正则化项作用,不同于l1范数(矩阵元素绝对值之和)的稀疏要求,l21范数还要求行稀疏