foreach判断最后一个_ArrayList集合为什么不能使用foreach增删改?

点击上方“Java技术前线”,选择“置顶或者星标”

与你一起成长

4051988d7f9efe554d1d86013b9d530c.png

译者:奋斗的小程序员链接:http://suo.im/4XaI8Q

编程过程中常常需要使用到集合,而ArrayList也是我们常常使用的,但是最近在一次删除和增加中出现了一些问题,分享记录下。

请看下面两段代码,哪段代码会报错呢,或者都成功呢。

List arrayList1 = new ArrayList();
arrayList1.add("1");
arrayList1.add("2");for (String s : arrayList1) {if("1".equals(s)){
 arrayList1.remove(s);
 }
}
List arrayList2 = new ArrayList();
arrayList2.add("2");
arrayList2.add("1");for (String s : arrayList2) {if("1".equals(s)){
 arrayList2.remove(s);
 }
}

程序运行结果如下:

arrayList1的remove方法成功执行,但是arrayList2的remove方法运行抛出ConcurrentModificationException异常。

为了寻找原因,我们只能看源代码了。

因为foreach的本质就是使用的迭代器Iterator,所有的Collection集合类都会实现Iterable接口。

找到ArrayList类的iterator()方法

2199a9e77a5f68e2d009c69b026b2af4.png

使用自己的Itr内部类,并且实现了Iterator接口

迭代器的本质是先调用hasNext()方法判断存不存在下一个元素,然后再使用next()方法取下一个元素

90483e22bad1f6b2286921801e05b3e9.pngItr内部类实现

上面arraylist1为什么能remove成功呢,其实它只循环了一次,所以成功了。

因为它在remove元素1之后,它的size - 1变成1,然后Itr内部的cursor变量由0变成1
此时1 = 1,循环结束,所以成功了。

arraylist2为什么remove失败呢,因为他在循环第二次的时候,也remove成功了,但是第三次判断next的时候cursor的值为2导致不等于现在的size 1,所以执行了next方法,最重要的来了,之前remove的操作导致ArrayList的modCount值加1,然后Itr类中的expectedModCount保持不变,所以会抛出异常。

7105a9348a450ad71c58fc9900fa1a5f.png

同理可得,由于add操作也会导致modCount自增,所以不允许在foreach中删除、增加、修改ArrayList中的元素。

对此,推荐大家使用迭代器Iterator删除元素,

Iterator iterator = arrayList2.iterator();while(iterator.hasNext()){
 String item = iterator.next();if("1".equals(item)){
 iterator.remove();
 }
}

如果存在并发操作,还需要对Iterator进行加锁操作。

- end -

9a5bf08443a8bbfc0514ee7e2f28d3f6.png

用心分享面试知识,做有温度的攻城狮

每天记得对自己说:你是最棒的!

往期推荐:
  • 为啥国人偏爱 Mybatis,而老外喜欢 Hibernate/JPA 呢?

  • 做一个完整的Java Web项目需要掌握的技能
  • GC 性能优化4 – GC 算法(基础篇)
  • SpringBoot 快速整合Mybatis(去XML化+注解进阶)
  • 我眼中的技术地图
  • 谁说用 Git 一定要用命令行?试试 SourceTree 吧
  • Java爬取并下载酷狗TOP500歌曲
  • MySQL update语句一个“经典”的坑
  • Google 出品的 Java 编码规范,强烈推荐,权威又科学!
  • Spring Boot 注解大全,真是太全了!
  • 前后端分离必备的接口规范,十分接地气!
  • 涨姿势了,写代码注意了,打死都不要用 User 这个单词

                     每一个“好看”,都是对我们最大的肯定!

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

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

相关文章

计算机文本处理竞赛题目,文字处理竞赛题目(word2010).pdf

文字处理竞赛题目(word2010).pdf (5页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!11.90 积分文字录入与排版高手竞赛 大 学 计 算 机 基 础 教 研 室 2 0 1 5 / 1 1 / 1 滁州学院 滁州学院《大学计…

头部外伤指什么_什么是颅骨缺损?

什么是颅骨缺损?颅骨缺损颅骨缺损(defect of skull)是指因开放性颅脑损伤造成的颅骨残缺,导致脑部与外界直接相通。颅脑创伤是造成颅骨缺损的主要原因。颅骨缺损综合征是该病的主要症状,常表现为头痛、头晕、缺损处不适、缺损边缘疼痛及感觉过…

java+什么时候才需要deploy_细思极恐 - 什么才是真正的会写 Java ?

文章核心其实,本不想把标题写的那么恐怖,只是发现很多人干了几年java以后,都自认为是一个不错的java程序员了,可以拿着上万的工资都处宣扬自己了,写这篇文章的目的并不是嘲讽和我一样做java的同行们,只是希…

csgo自建服务器打人机,csgo如何跟好友打人机 | 手游网游页游攻略大全

发布时间:2017-02-14CSGO即将在4月18日开启国服先锋测试,如何在CSGO中添加好友呢?下面为大家分享一下CSGO国服加好友方法,一起来看看吧. CSGO国服怎么加好友: 1.打完官匹想加队友好友只需要打开游戏界面正上方观战-我的比赛. ...标签:攻略秘籍 乐游知道…

python求定积分的函数_手搓计算化学(GTO积分by python)

挤牙膏(1/∞)完全基于Python的GTO积分库get√scf因为惨不忍睹已经回炉重做((用python不用c是因为还有其他后续工作,不能封装得连函数都看不到(不然怎么重载代码还提供了积分值公式推导的符号计算&#xff0…

java8新特性_Java8新特性_lambda表达式

lambda介绍λ ,希腊字母表中排序第十一位的字母,英语名称为Lambda。lambda 表达式,也可称为闭包,它是推动Java 8 发布的最重要新特性,允许把函数作为一个方法的参数(函数作为参数传递进方法中)。…

ajax实现局部删除,Express+AdminLTE+hbs+Ajax实现局部刷新终极版(第二部分)

上一篇中已经把所有思路都理顺了,这边我们就开始具体编码吧。(如果您有更好的办法,欢迎留言讨论!互相学习!)我们先来看一下最终完成的效果:一:完整项目目录结构如图所示:二:更换模板…

打乱 数字_崔召幼儿园中班悦享时光——亲子益智游戏数字配对

亲爱的小朋友们,我们已经掌握了简单的,数字宝宝,今天让我们通过已有的数字经验和点数经验来玩一个数字配对的游戏吧!准备:1.准备骰子一个,吸管一支,数字1-6卡片。 2.一个鞋盒盖,一个…

云服务器BBC销售渠道,云服务器BBC控制台

云服务器BBC控制台 内容精选换一换云服务器备份提供了Web化的服务管理平台,即管理控制台和基于HTTPS请求的API(Application programming interface)管理方式。API方式如果用户需要将云服务平台上的服务器备份集成到第三方系统,用于二次开发,请…

python随机数据随概率分布_概率分布及其Python实现

一、学习概率分布有什么用?很多现实中的分布都来自几种概率分布。对个人生活和工作选择非常有帮助。 知道某件事发生的概率对我们作出数据分析决策很有帮助。有时候计算概率很简单,有时候计算概率很复杂,概率分布是帮助我们解决特定问题下的万能模版。 …

安全策略_Spring Security 实战干货:如何实现不同的接口不同的安全策略

1. 前言欢迎阅读 Spring Security 实战干货 系列文章 。最近有开发小伙伴提了一个有趣的问题。他正在做一个项目,涉及两种风格,一种是给小程序出接口,安全上使用无状态的JWT Token;另一种是管理后台使用的是Freemarker&#xff0c…

antd 怎么用ajax,react+dva+antd接口调用方式

一丶 安装通过 npm 安装 dva-cli 并确保版本是0.8.1或以上。$ npm install dva-cli -g$ dva -v0.8.1二丶创建新应用安装完dva-cli之后,就可以在命令行里访问到dva命令(不能访问?)。现在,你可以通过dva new创建新应用。$ dva new dva-quicksta…

python外星人入侵怎么发给别人_python_外星人入侵(1-1)

sys:system的简称。包含了一些与系统有关的函数。 step1:构建游戏的主框架 import sys import pygame def run_game(): 初始化游戏并创建一个屏幕对象 pygame.init() # 创建一个显示窗口,宽1200像素,高800像素 screen pygame.dis…

gta5怎么设置画质最好_GTA5画面如何设置最好_GTA5画质设置成最高配置推荐-win7之家...

GTA5是侠盗猎车手的简称,这款游戏是很多玩家都很热爱的一款网络游戏,在游戏过程中,我们可以通过画面设置来提高游戏的画面效果,不过还要顾及游戏的流畅性,那么GTA5画面如何设置最好呢?针对这个问题&#xf…

js ajax递归调用,js的promise如何递归调用?

好问题,正中Promise机制的核心之一:then方法返回另一个promise2,其内容是由回调方法的返回值决定的;回调中可以返回promise3,使外面的promise2的内容成为promise3的内容也就是说,如果要用promise来递归&…

python用outlook自动发邮件_python使用两种发邮件的方式smtp和outlook示例

smtp是直接调用163邮箱的smtp服务器,需要在163邮箱中设置一下。outlook发送就是Python直接调用win32方式。调用程序outlook直接发送邮件。 import win32com.client as win32 import xlrd outlook win32.Dispatch(outlook.application) mail outlook.CreateItem(0)…

cpu java poi 导出_Java里当POI导出Excel数据比较大时的优化方案

问题在Java里绝大多数都是使用POI进行导入导出Excel,正常情况下也都没有问题。但当导出的数据量比较大时,我留意到我本机当数据量达到两三万条(二十个列)时,就会出现内存溢出,CPU飙升到95%以上的情况。可能换到好点的服务器上会好…

服务器在行例维护中,8月14日服务器例行维护公告

原标题:8月14日服务器例行维护公告亲爱的玩家:青龙乱舞区、大地飞鹰区、天命风流区、沧海云帆区全部服务器将在8月14日6:00~10:00停机维护更新,维护完成后上述各服务器客户端版本更新至2.0.94.6。本次维护主要调整和修改内容如下,…

dedecms联动筛选_DEDECMS分类信息按联动类别筛选的实现方法

注意:本教程只在DedeCMS V5.6上测试过,v5.7sp1的话一般也会通用,请自行测试!实现方法:1. 修改include\taglib\infolink.lib.php,找到:require_once(DEDEROOT./data/enums/infotype.php);在其下面…

暗黑2战网服务器爆率修改,暗黑2修改MOD最初级基础

第一步:得到修改所用的工具修改MOD首要的是工具,这里推荐几款常用工具:MPQ文件打开及导入工具:MPQWorkshop 备用:mpqview CV5.x (初级入门推荐mpqworkshop,必需)MPQWorkshop是目前最好的工具,主…