java for的增强_Java基础之增强for循环

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

849a1fbd7392d8b26375ed40bcb4c39e.png

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

c32052be8456c05d3d704b14a5d19a0d.png

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

85be2226dd357585ff3a2c22d51858bd.png

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

93f490c800bc59c62cb1e79177b4d443.png

e762373a7b88f3369dc4818ba066db0a.png

13b3cccc02d29cd78aa88eca32fa6382.png

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

bc9a4423a54049e00368ffbc921e7d7a.png

237fba700ae532b9d5838115da880792.png

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

普通for循环

06bdb6879ac544d52991c2f841af9c68.png

c49bd48a51e2fc3c8b68783bac8bc722.png

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

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

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

迭代器循环

3a7de3c5bf67937c0b3f8bbb2d6dc1d0.png

a98b545538313c558ef09d54775cc7d1.png

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

所以

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

window.history 和 DWZ 框架

DWZ框架的ajax请求返回的一般都是一个HTML片段&#xff0c;整个页面是由一个个HTML片段组成的&#xff0c;可以由TAB切换其内容&#xff0c;但是只有一个body和HEAD&#xff0c;一般head 和 菜单栏是不会动的。 今天遇到一个问题&#xff0c;当一个点击进入一个tab页面时&#…

大道至简(第六章)读后感

大道至简&#xff08;第六章&#xff09;读后感 还是不乐意去读&#xff0c;但总算可以耐心的读下去了&#xff0c;这也许也算是读大道至简以来的收获之一吧。第六章的题目是从编程到工程&#xff0c;看到工程二字&#xff0c;让我不由想起了前几天和高中同学聊天。他报的燕大土…

遏止个人信息泄露亟待立法跟进

据报道&#xff0c;近日全国30个省份275位艾滋病感染者称接到了诈骗电话&#xff0c;艾滋病感染者的个人信息疑似被大面积泄露。无独有偶&#xff0c;近日票务网站大麦网因账号信息被窃取&#xff0c;间接导致全国多地用户受骗。目前至少有17名受害者&#xff0c;被骗至少54万元…

确认类是否可以在运行期使用

问题: 你正在使用最新版的 SDK 中的一些类,但是你不确定这些类是否能在你程序运行的设 备中可用,因为有可能你部署的目标设备要比最新版 SDK 早。 方案: 用NSClassFromString函数. 传入类的名称字符串符。若是返回值为空(nil),则表示这个类无法在这台设备上使用;反之,这个类则…

最新hosts,更新hosts,可用

点击这里&#xff0c;全选后复制&#xff0c;粘贴到C:\Windows\System32\drivers\etc的hosts里面&#xff0c;把原来的置换了转载于:https://www.cnblogs.com/zzw1994/p/4940924.html

酒店业解决方案

思科业务就绪酒店解决方案&#xff0c;为酒店的经营和管理提供一个高效率、高盈利、且可不断发展和改进的平台&#xff0c;帮您重建酒店竞争优势&#xff0c;为酒店带来意想不到的转变&#xff01; 思科酒店行业解决方案更加融合的思科网络在改善酒店的运营和员工生产率&#x…

配置SQL Server 2012 AlwaysOn ——step1 建立AD域及DNS配置

需要三台安装好windows server 2008 R2 sp1的虚拟机服务器SQLTESTDNS&#xff0c;SQLTESTMAIN,SQLTESTSUB&#xff0c;以SQLTESTMAIN为主数据库及群集服务器&#xff0c;SQLTESTDNS为DNS及域服务器 1.在SQLTESTDNS的服务器管理器内设置静态IP地址192.168.10.1,DNS为127.0.0.1&a…

lintcode:递归打印数字

题目 用递归打印数字 用递归的方法找到从1到最大的N位整数。 样例 给出 N 1, 返回[1,2,3,4,5,6,7,8,9]. 给出 N 2, 返回[1,2,3,4,5,6,7,8,9,10,11,...,99]. 注意 用下面这种方式去递归其实很容易&#xff1a; recursion(i) {if i > largest number:returnresults.add(i)r…

做免费的EDM,EmailCar看中的是挖掘数据的价值

从2008年开始&#xff0c;做了9年企业级EDM&#xff08;电子邮件营销&#xff09;服务的陆霏近日宣布&#xff0c;他们的产品EmailCar从4.0版本开始永久免费为企业提供电子邮件基础投递业务。 我们电子邮箱经常收到的推广邮件就属于EDM&#xff0c;即Email Direct Marketing。这…

java 读取split_Java报错系列——split

在String中,split方法如下&#xff1a;可见&#xff0c;split的核心在于Pattern.compile(regex).split(this, limit);Java提供Pattern,Matcher用于支持正则&#xff0c;可以看一个例子&#xff1a;运行结果是&#xff1a;0,1||3,4|ab|7,8|cef|8,9||11,12|kk|13,14|a|需要注意的…

VS2012生成事件

Visual Studio 事件生成功能对我们开发综合项目的过程中尤为重要。 下面以VS2012为例&#xff1a; 选择工程-> 属性->编译->生成事件 包括两个生成事件&#xff1a;预先生成事件和后期生成事件 直接在相应的文本框里编写写脚本即可&#xff0c;如&#xff1a;编译完成…

H3C Navigate 2017 | 拉近世界的距离 新华三的泛联接版图

就今天而言&#xff0c;联接世界的网络外延已经无限扩大&#xff0c;联接的方式也越来越复杂。从互联网时代的PC互联&#xff0c;演进到移动互联网时代手机等移动终端的互联&#xff0c;而即将大规模爆发的物联网应用时代&#xff0c;所有的事物都可能被连入网络&#xff0c;一…

java gc log调优_Java 开启 gc 日志

构建一个 jar 包程序使用 Spring Boot 构建一个简单的 web 程序&#xff0c;可以直接使用 java -jar 来启动。RestControllerRequestMapping("/root")SpringBootApplicationpublic class SbDemoApplication {public static void main(String[] args) {SpringApplicat…

大数据时代的公共安全治理

未来&#xff0c;大数据将成为社会基础设施的一部分&#xff0c;跟公路、自来水、电一样&#xff0c;成为人们生活不可或缺的一部分。但大数据的作用并不仅仅局限于为普通消费者提供生活必须服务&#xff0c;它已经开始在信息产业、公共安全、交通运输、金融、水利等领域中发挥…

CCNA第二讲笔记

网络定义&#xff1a;一组由介质&#xff08;线缆&#xff09;互联的网络设备&#xff08;路由器、交换机&#xff09;和终端系统&#xff08;PC&#xff09;&#xff1b; 工作组&#xff1a;局域网范畴&#xff0c;范围最小的局域网&#xff0c;且不涉及网络设备。台式机需要有…

晶科电力打造山东省最大物流港分布式光伏项目

近日&#xff0c;晶科电力有限公司宣布&#xff0c;由该公司投建的山东省最大物流港分布式光伏项目已破土动工&#xff0c;成为山东省又一标志性光伏项目。 该项目装机量为6兆瓦&#xff0c;占用物流港厂房屋顶面积约68330平方米&#xff0c;平均每年发电量约601.22万kWh&#…

服务器资源管理器视图的添加显示的步骤

MVC视图查看数据库表结构时&#xff0c;通常会打开服务器资源管理器视图&#xff0c;在服务器资源管理器视图中能查看表的数据集及表结构 打开的方法为&#xff1a; ①可使用快捷键&#xff1a; ctrlaltS ②也可添加“服务器资源管理器视图”到“视图”工具菜单&#xff0c;做法…

java中怎么用代码打出ASCII码字符_JAVA实现打印ascii码表代码

我就废话不多说了&#xff0c;大家还是直接看代码吧~package com.jalor;public class AAAA {public static void main(String[] args) {outputA(65);outputA(97);}// 打印ascii码表public static void outputA(int count){for (int i 0; i < 26; i) {System.out.print((cha…

javascript this指针指向?

前言 理解javascript的指针就需要先了解js的执行环境和作用域&#xff01;执行环境的定义了变量或函数有权访问的其他数据&#xff0c;决定了它们各自的行为。每个执行环境都有一个与之关联的变量对象&#xff0c;环境中定义的所有的变量和函数都保存在这个对象中。虽然我们编写…

能源局将提高光伏“领跑者”项目技术指标

记者从权威渠道获悉&#xff0c;国家能源局正计划对光伏“领跑者”中有关单多晶的转换效率标准等细节进行修改。“领跑者”计划中&#xff0c;光电转换效率的修订工作将在今年3月底展开&#xff0c;主要向各大相关机构、企业征求意见&#xff0c;如果争议较多&#xff0c;定稿时…