文档章节

ArrayList foreach 循环里进行元素的 remove add 操作有什么现象?

冷冷gg
 冷冷gg
发布于 2017/02/16 13:29
字数 234
阅读 91
收藏 0
点赞 0
评论 0

先来看看《阿里巴巴Java开发手册》中的一段

【强制】不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator
方式,如果并发操作,需要对 Iterator 对象加锁。
反例:
List<String> a = new ArrayList<String>();
a.add("1");
a.add("2");
for (String temp : a) {
    if("1".equals(temp)){
        a.remove(temp);
    }
}
说明:这个例子的执行结果会出乎大家的意料,那么试一下把“1”换成“2”,会是同样的结
果吗?
正例:
Iterator<String> it = a.iterator();
while(it.hasNext()){
    String temp = it.next();
    if(删除元素的条件){
        it.remove();
    }
} 

当1的时候,能够正确输出remove 以后的ArrayList
当2的时候,抛出了 ConcurrentModificationException

看一段ArrayList 的forEachRemaining 方法的源码


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

本质上是隐式的 iterator 由于没有重新设置 expectedModCount ,当你使用 list.remove() 后遍历执行 iterator.next() 时就会报ConcurrentModificationException

© 著作权归作者所有

共有 人打赏支持
冷冷gg
粉丝 299
博文 109
码字总数 49005
作品 1
潍坊
UI设计师
被忽视的ArrayList,你知道多少

我们对一些框架,并发,方案 狂热追求的同时,往往有时候会忽略一些经常用到一些API 比如HashMap ,ArrayList等。 之前对ArrayList迭代删除的同时遇到了一些问题,当时却不了了之了,这种思想...

键走偏锋
07/06
0
0
Java中List集合的遍历

一、对List的遍历有三种方式 List list = new ArrayList(); list.add("testone"); list.add(“testtwo”); ... 第一种: for(Iterator it = list.iterator(); it.hasNext(); ) { .... } 这种方......

www19
2017/06/19
0
0
Java中List集合的遍历

一、对List的遍历有三种方式 List<String> list = new ArrayList<String>(); list.add("testone"); list.add(“testtwo”); ... 第一种: for(Iterator<String> it = list.iterator(); it.has......

Mr_LGQ
2016/01/12
42
0
阿里JAVA开发手册零度的思考理解(二)

简书 匠心零度 转载请注明原创出处,谢谢! 说在前面 人生的大道上默默地走,就必须要有一盏灯亮着为你引导方向!而这盏灯抑或只是一句话,一句鼓励,一个赞美,一次承认,一次认可,一次相识...

匠心零度
2017/11/04
0
0
阿里JAVA开发手册零度的思考理解(二)

转载请注明原创出处,谢谢! 说在前面 人生的大道上默默地走,就必须要有一盏灯亮着为你引导方向!而这盏灯抑或只是一句话,一句鼓励,一个赞美,一次承认,一次认可,一次相识一次交流…… ...

匠心零度
2017/11/04
0
0
java软件开发人中经常误解区

数组(array)转成集合(ArrayList) 错误:如经常这样处理 List<String> list = Array.asList(arr); Arrays.asList()方法返回的是Arrays里的私有静态内部类ArrayList,不是集合java.util.A...

longbadx
2014/06/04
0
0
ArrayList循环遍历并删除元素的常见陷阱

ArrayList循环遍历并删除元素的常见陷阱 栏目:Java基础 作者:admin 日期:2015-04-18 评论:2点击: 1,666 次 在工作和学习中,经常碰到删除ArrayList里面的某个元素,看似一个很简单的问题,却...

zh151832
2016/02/01
713
0
ConcurrentModificationException的原因以及解决措施

ConcurrentModificationException异常出现的原因 先看下面这段代码: package test; import java.util.ArrayList;import java.util.Iterator; public class test {public static void main(S......

Hosee
2016/02/01
885
0
java.util.ConcurrentModificationException异常详解

一、问题发现 在迭代集合元素时,如果对集合做add/remove操作,会抛出java.util.ConcurrentModificationException异常。 如下代码所示: 执行上诉代码,会抛出异常: 这是为什么呢? 二、问题...

最王座
2016/07/06
83
0
正确使用ArrayList和LinkedList

原文链接地址 最近在看数据结构,发现这个东西不错,记录下来,以便分享! ArrayList内部是使用可増长数组实现的,所以是用get和set方法是花费常数时间的,但是如果插入元素和删除元素,除非...

zongjh
2014/05/06
2.5K
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Elasitcsearch High Level Rest Client学习笔记(三)批量api

Bulk Request BulkRequest可以在一起从请求执行批量添加、更新和删除,至少需要添加一个操作 BulkRequest request = new BulkRequest(); //创建BulkRequestrequest.add(new IndexRequest("...

木子SMZ
5分钟前
0
0
mybatis-dynamic sql

OGNL expressions if 判断是否存在值 <select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title like #{tit......

writeademo
13分钟前
0
0
社交系统ThinkSNS+ V1.8.3更新播报

     研发发布版本号:1.8.3   本次版本于2018年7月16日发布   本次发布类型:新增功能、细节调整与优化   社交系统ThinkSNSPlus更新体验:请于官网下载/安装最新版或联系QQ35159...

ThinkSNS账号
16分钟前
0
0
教育思考:选择编程是一场父母和孩子的和解[图]

教育思考:选择编程是一场父母和孩子的和解[图]: 之前有个很热的段子是这样讲的:深夜十点的时候,某小区一女子大声喊叫“什么关系?啊?!到底什么关系?你说!”最后发现原来是一位妈妈陪...

原创小博客
17分钟前
0
0
X64汇编之指令格式解析

最近由于项目组内要做特征码搜索的东西,便于去Hook一些未导出函数,你懂得...于是就闲着学习了一下x86/x64的汇编指令格式。x86的汇编指令格式请参照http://bbs.pediy.com/showthread.php?t...

simpower
20分钟前
0
0
rust 语法概要(只适合不熟悉时快速查阅使用,不适合理解其精髓。未完待续)

注意:本内容只适合快查,不适合理解精髓。精髓请研读 https://kaisery.github.io/trpl-zh-cn/foreword.html 基本数据类型 i8,i16,i32,i64,i128 u8,u16,u32,u64,u128 f32,f64 char bool:true...

捍卫机密
23分钟前
0
0
JS中严格模式和非严格模式

1,使用 严格模式的使用很简单,只有在代码首部加入字符串 "use strict"。必须在首部即首部指其前面没有任何有效js代码除注释,否则无效 2.注意事项 (1)不使用var声明变量严格模式中将不通...

AndyZhouX
23分钟前
0
0
Nginx配置error_page 404 500等自定义的错误页面

Nginx 做web server时, 开发中发现有时候的网站代码有错误,我们需要跳转到一个指定内容的错误页面: 1. 在nginx.conf配置文件上加上一句: fastcgi_intercept_errors on; 2. 服务中加上: er...

MichaelShu
25分钟前
1
0
微服务架构下的监控系统设计(一)——指标数据的采集展示

前言 微服务是一种架构风格,一个大型复杂软件应用通常由多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。...

UCloudTech
31分钟前
0
0
极客时间《趣谈网络协议》之开篇词学习笔记

出于个人兴趣,本人在极客时间购买了网易研究院云计算技术部的首席架构师刘超老师关于计算机网络的专栏之《趣谈网络协议》,由于知识版权原因,不能直接分享刘超老师的原文,所以,我会在每次...

aibinxiao
33分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部