Java基础之增强for循环
平时大家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循环要注意陷阱
什么是增强for循环 增强for循环是一种简单模式的for循环,为了方便数组和集合的遍历而存在. int[] arr = new int[]{1, 2, 3, 4, 5, 6}; for (int a ...
- java基础39 增强for循环(也叫foreach循环)
增强for循环是jdk1.5出现的新功能 1.增强for循环的作用 简化了迭代器的书写格式(注意:增强for循环底层还是使用了迭代器遍历) 2.增强for循环的格式 for(数据类型 变量名:遍历的目 ...
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
在perference 加content Assist 可以设置快捷键 透视图与视图 透视图:Debug和java主窗口 视图:每一个小窗口就是视图 高版本的java可运行低版本的java版本 常见的 ...
- Java中的增强for循环
增强 for 循环 1. 增强的 for 循环对于遍历 Array 或 Collection 的时候相当方便. import java.util.*; public class Test { publ ...
- Java中的增强 for 循环 foreach
foreach 是 Java 中的一种语法糖,几乎每一种语言都有一些这样的语法糖来方便程序员进行开发,编译期间以特定的字节码或特定的方式来对这些语法进行处理.能够提高性能,并减少代码出错的几率.在 J ...
- 【Java基础】【04循环语句&方法】
04.01_Java语言基础(循环结构概述和for语句的格式及其使用) A:循环结构的分类 for,while,do...while B:循环结构for语句的格式: for(初始化表达式;条件表达式; ...
- java基础:switch语句应用,循环的详细介绍以及使用,附练习案列
1. switch语句 1.1 分支语句switch语句 格式 switch (表达式) { case 1: 语句体1; break; case 2: 语句体2; break; ... default ...
- Java基础之分支结构循环结构
流程控制语句if(分支结构) 流程控制:流程就是指代码运行过程.控制就是说什么场景可以执行,什么场景不能执行. 1.if语句第一种形式 格式:if(表达式){ 执行的语句: } 2. ...
- 9.Java基础_for/while/do-while循环
/* for循环(同C++) 初始化变量的作用域为循环体 出了循环体,初始化的局部变量消失 for(初始化;条件判断;条件控制){ 循环体; } while循环 while(条件判断){ 循环体; } ...
随机推荐
- cordova-plugin-local-notifications发送Android本地消息
原文:cordova-plugin-local-notifications发送Android本地消息 1.GitHub源代码地址: https://github.com/katzer/cordova- ...
- Python标准库(3.x): 内建函数扫盲
Built-in Functions abs() dict() help() min() setattr() all() dir() hex() next() slice() any() divmod ...
- 赵伟国:陆资无法进入台湾紫光要到WTO控告(芯片是为了经济安全,高通找的人不是很聪明)
集微网消息,昨天由全球半导体联盟和上海市集成电路行业协会联合举办的Memory +论坛在上海举行,会议透过来自存储器.逻辑和系统市场领先企业的高管,深入他们对未来存储器的应用.可行的商业模式,以及逻辑 ...
- MS SQL SERVER搜索某个表的主键所在的列名
原文:MS SQL SERVER搜索某个表的主键所在的列名 SELECT SYSCOLUMNS.name FROM SYSCOLUMNS,SYSOBJECTS,SYSINDEXES,SYSINDEX ...
- 创建第一个ASP.NET MVC项目
创建 新建->项目->展开Web->ASP.NET Web应用程序->MVC->确认 ASP.NET MVC应用程序的目录结构 /Controllers该目录保存处理UR ...
- new和delete必须成对出现吗?【网上集合贴+个人总结】
new和delete必须成对出现吗?[网上集合贴+个人总结] 1.从内存泄露与否的角度考虑 new 和 delete不一定要成对出現.理论上是這樣的.但是从习惯上來說,new delete成對出現是一 ...
- 使用VS2010再装VS2013不用再烦恼不兼容
某些同事有时在开发过程中出现这么个问题,在使用js直接异步调用类库时,弹出错误类库不存在或者没有定义等,类似问题,这个时候可能你正在绞尽脑汁的去解决问题,明明问题不大,为什么安装VS2013后就不能打 ...
- .NET Core RC2在Linux下部署
前言 目前ASP.NET Core RC2已经正式发布了,可以参考如下链接: https://blogs.msdn.microsoft.com/dotnet/2016/05/06/net-core-r ...
- 搭建RPC over HTTP 环境遇到的问题
最近需要做RPC的IPS协议分析,需要了解一下RPC over HTTP的协议格式,由于此类数据包不易构造,故此想搭建一个抓一些包分析一下. 结果搭建这么个环境硬是用了我四个工作日的时间,崩溃加无语. ...
- 基于Google Earth Engine的全国地表温度反演
国内研究landsat8温度反演的人员很多,但是现有算法一般都是一景为例子,进行开展. 这有一个局限性,当研究的尺度很大时,就需要比较大的运算量了,例如全省温度,全国温度,全球温度,当然大家可能会说, ...