平时大家for循环应该用的不少,特别是增强for循环,简单快捷。但是在增强for中做删除操作,却会抛出java.util.ConcurrentModificationException,一起来看下。

上面的代码,在for循环执行完if中的remove,遍历下一个元素时便会抛出java.util.ConcurrentModificationException。到底在for (String s : list)中发生了什么呢。

ArrayList中有一个内部类Itr,它继承了Iterator接口。当第一次遍历增强for循环时,会创建一个Itr对象,注意下图红框的部分,变量modCount属于ArrayList,用来记录ArrayList被修改的次数,赋值给了Itr类的变量expectedModCount。

然后依次调用Itr的hasNext()和next()方法,取出ArrayList中的元素赋值给for中的变量,注意红框的方法checkForComodification()。

当执行list.remove(s)时,实则调用其内部的fastRemove(index)做的删除操作,同时modCount++,但是并没有重新赋值给Itr类的变量expectedModCount。那么,当遍历下一个元素调用checkForComodification()方法时,if中的条件就会成立,然后就会抛出ConcurrentModificationException异常。

既然增强for循环中的remove操作会抛异常,那么在普通for循环和迭代器循环中做remove也会抛异常吗?

普通for循环

普通for循环调用的是remove(int index)方法,不会抛异常,但是需要注意,

1. 如果将for中的i < list.size()替换成i < length,会抛出IndexOutOfBoundsException

2. 在list.remove(i)后,下一次遍历前,此时i表示第i+1个元素

迭代器循环

迭代器循环调用的是Itr类的remove(int index)方法,不会抛异常,原因是其内部也是调用的ArrayList的remove(int index)方法,但是在之后,有给expectedModCount重新赋值。

所以

增强for循环,实际上还是迭代器遍历,但是remove操作并没有同步变量,会导致异常;普通for虽然没有异常,但是在remove后可能会忽略下标+1而出错;如果要在遍历时删除,最安全就是用迭代器。

java for的增强_Java基础之增强for循环相关推荐

  1. java io流 教程_Java基础教程:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:指的是从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列 ...

  2. java的技术定义_java基础知识——Java的定义,特点和技术平台

    (作者声明:对于Java编程语言,很多人只知道怎么用,却对其了解甚少.我也是其中一员.所以菜鸟的我,去查询了教科书以及大神的总结,主要参考了<Java核心技术>这本神作.现在分享给大家!) ...

  3. java 输出一个爱心_java基础 之 几个常用的类

    在以上的文章中我们看了Java的一些基础的使用,今天我们主要学习一下Java的几个常用的类 java操作系统底层Sytem类: System类代表当前Java程序的运行平台,程序不能创建System类 ...

  4. java 定义map集合_java基础-Map集合

    java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...

  5. java list键值_java基础之对List,Map,Set等集合键值对的简单认识

    [一.集合] 特征: 数组:定长.可以放基本数据类型. List:变长.只能放对象.有序,可重复. Set :变长.只能放对象.无序,不可重复. Map :变长.只能放对象.无序,键值对. 重要实现类 ...

  6. java default修饰符_Java基础语法二

    Java循环结构 for循环 /* for(初始化;布尔表达式;更新) {执行代码 } */ for(int i=0; i < 5; i++) {System.out.println(i); } ...

  7. java知识串讲_java基础之Java知识串讲

    一.JDK个版本之间的区别: 1.JDK1.5的新特性: 泛型ArrayList list = new ArrayList();-->ArrayList list = new ArrayList ...

  8. 基础java重点知识总结_Java基础知识要点总结

    1.数据类型 在java 中,要注意的是double,float,long这三种数据类型. java中默认小数类型都是double,因此在要用到float 时,要在小数的最后加上f或F,long类型也 ...

  9. java集合对象声明_Java基础————集合类

    原标题:Java基础----集合类 理解集合类 集合类存放于java.util包中. 集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(refere ...

最新文章

  1. 计算机网络-物理层设备
  2. mysql myisam innodb 区别
  3. djpython教程_简单介绍Python的Django框架的dj-scaffold项目
  4. 想学习java,如果学不会java怎么办?
  5. Flutter PageView 属性使用详解
  6. python 多层for循环转递归/迭代
  7. 添加文字 高德地图_教您,如何在高德和腾讯定位自己的店铺位置
  8. mysql 编译 bsion_mysql编译安装
  9. sharepoint 使用命令行注册dll文件到gac的方法
  10. 专家程序员要了解的mysql_从程序员的角度深入理解MySQL
  11. OpenCV3.1安装包下载
  12. matlab2017a安装出现license checkout failed Error-8
  13. 思科交换机和路由器的配置
  14. 贪心 汽车加油 java_汽车加油问题之贪心算法
  15. 【读书笔记】汇编语言程序设计
  16. Struts1.x系列教程(1):用MyEclipse开发第一个Struts程序
  17. mongodb Linux C++开发环境调研
  18. unity替换shader方法
  19. 关于C语言中,while循环的结束
  20. 使用 PHP 处理HTTP 响应报文

热门文章

  1. 通过点击切换文本框内容的脚本示例
  2. Quartz.NET 架构与源代码分析系列 part 1 :Quartz.NET 入门
  3. MVC是一种用于表示层设计的复合设计模式
  4. RHEL7 USB installation problem and solving
  5. svn文件大小类型限制,提交必须加多少字的说明
  6. SQL Server2008 表旋转(pivot)技术
  7. windows 自动copy远程服务器文件
  8. 我是如何实用:before :after
  9. 记一次vue项目yarn打包环境配置失效的解决方案
  10. vue-cli项目中.postcssrc.js