2019独角兽企业重金招聘Python工程师标准>>>

首先是两段代码的执行结果:

代码一:

public class TestListRemove {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);list.add(6);list.add(7);for (Iterator<Integer> it = list.iterator(); it.hasNext();) {Integer val = it.next();if (val == 1) {list.remove(val);}}for (Integer i : list) {System.out.println(i);}}
}

代码二:

public class TestListRemove {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);list.add(6);list.add(7);for (Iterator<Integer> it = list.iterator(); it.hasNext();) {Integer val = it.next();if (val == 6) {list.remove(val);}}for (Integer i : list) {System.out.println(i);}}
}

代码一结果:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
    at java.util.ArrayList$Itr.next(ArrayList.java:791)
    at com.odling.test.TestListRemove.main(TestListRemove.java:21)

代码二结果:

1
2
3
4
5
7

原因就是这里:

首先代码一抛错是这段代码:

Integer val = it.next();

final void checkForComodification() {if (modCount != expectedModCount)throw new ConcurrentModificationException();}

这个异常网上很多文章就不说了。

AbsrtactList中iteraor方法返回一个内部类,这个类实现了iterator接口,hasNext()对cursor和list的size判断。

关于cursor的参数说明:

int cursor;       // index of next element to return

如果删除了倒数第二个元素,拿代码二举栗子:cursor返回6,size因为被remove掉一个,所以也是6,hasNext()方法返回false,不会再执行Integer val = it.next();  所以代码二没有异常,但是元素确实被remove了。

public boolean hasNext() {return cursor != size();}

再来看一下对代码一的改进:

public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);list.add(6);list.add(7);for (Iterator<Integer> it = list.iterator(); it.hasNext();) {try {Integer val = it.next();if (val == 1) {list.remove(val);}} catch (Exception e) {System.out.println("发生异常。");break;}}for (Integer i : list) {System.out.println(i);}}

结果:

发生异常。
2
3
4
5
6
7

发现元素确实已经被remove掉了。

转载于:https://my.oschina.net/yZLZkvk6bjiN/blog/885272

关于java.util.ConcurrentModificationException和remove倒数第二个元素相关推荐

  1. 【集合类】 1 java.util.ConcurrentModificationException异常详解ArrayListCopyOnWriteArrayList原理探究

    环境:JDK 1.8.0_111 文章目录 概述 一.单线程情况下问题分析及解决方案 1.1 问题复现 1.2 问题原因分析 1.3 问题解决方案 二. 多线程情况下的问题分析及解决方案 2.1 问题 ...

  2. java.util.ConcurrentModificationException(并发修改错...

    为什么80%的码农都做不了架构师?>>>    public class ConcurrentModificationExceptionextends RuntimeExceptio ...

  3. 出现 java.util.ConcurrentModificationException 时的解决办法

    for (int i=0; i<list.size(); i++) { // 只有在这种方式遍历集合时,同时对集合增加.删除才不会影响. // list.remove(list.get(i)); ...

  4. 非线程安全类ArrayList出现异常:java.util.ConcurrentModificationException

    今天执行了一段<图解多线程设计模式>中的代码,结果抛出了如下的异常: Exception in thread "ReaderThread" java.util.Conc ...

  5. 异常:java.util.ConcurrentModificationException

    Quote: 异常:java.util.ConcurrentModificationException 在Map或者Collection的时候,不要用它们的API直接修改集合的内容,如果要修改可以用I ...

  6. java.util.ConcurrentModificationException 解决办法

    在使用iterator.hasNext()操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除. 则使用会报以下异常: Java.util.ConcurrentModifi ...

  7. 为什么会出现 java.util.ConcurrentModificationException 异常?

    http://www.iteye.com/topic/124788 在Map或者Collection的时候,不要用它们的API直接修改集合的内容(否则会出现 java.util.ConcurrentM ...

  8. 循环的时候去删除集合中的元素 java.util.ConcurrentModificationException

    使用for循环,删除集合中的元素,会报错 java.util.ConcurrentModificationException 只能通过迭代器 iterator删除 1:在while循环中使用itera ...

  9. java.util.ConcurrentModificationException异常

    2019独角兽企业重金招聘Python工程师标准>>> <p>    今天遇到了一个小bug,在对ArrayList操作时出现了java.util.ConcurrentM ...

最新文章

  1. react-navigation
  2. python与R行列数据过滤(row column filtering):dplyr、 isnull、isna、drop、select、iloc、loc、isin、filter
  3. JavaScript实现放大镜功能
  4. 耿建超英语语法---被动语态
  5. ssh远程工具_良心国产工具,比Xshell好用还免费!
  6. 微信开发修改button里的字体大小_微信小程序全栈开发课程【视频版】2.2 index页面完善...
  7. 50道Java集合经典面试题
  8. Oracle PL/SQL编程之变量
  9. 史上最佳GAN被超越!生成人脸动物高清大图真假难辨,DeepMind发布二代VQ-VAE
  10. OE 发邮件 500 Error: bad syntax', Port: 25, ... Error Number: 0x800CCC79
  11. Matlab系列教程_数值计算_求方差和标准差
  12. matlab 画短时平均幅度谱
  13. 计算机与home键功能相反的是,home键是什么,虚拟home键如何使用
  14. 输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历。
  15. 计算机科学和热力学,相图热力学数据库及其计算软件: 过去、现在和将来
  16. 高速公路超速处罚:按照规定,在高速公路上行驶的机动车,超出本车道限速的10%则处200元的罚款;若超出50%,就要吊销驾驶证。请编写
  17. android外接USB扫码器应用闪退,外接U盘正常的情况
  18. 中标麒麟 NeoKylin-SDK 里都有哪些库文件
  19. 关于面试“有戏”和“没戏”的信号
  20. 主数据管理平台应具备的六大功能

热门文章

  1. unix系统编码 java_JAVA字符编码系列三:Java应用中的编码问题
  2. html5怎么改为vue_Vue实战——编程式导航打开新窗口,登录状态本地存储
  3. 怎么在linux中查询yum,linux - 如何使用YUM列出包的内容?
  4. mysql 分页 jdbc_JDBC调用MySQL分页存储过程实现(一)
  5. ios传值给js_WKWebView JS与OC间相互传值调用
  6. 图像控制点 形变_基于控制点的图象变形方法及其应用
  7. SpringBoot入门一
  8. 【算法篇】八种内排序算法
  9. MySQL 异常:这一篇就够了,MySQL 抛出异常的几种常见解决方式小结
  10. java暂停5s_java如何实现继续/暂停按钮