文档章节

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

冷冷gg
 冷冷gg
发布于 2017/02/16 13:29
字数 234
阅读 108
收藏 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
粉丝 402
博文 112
码字总数 52056
作品 1
潍坊
UI设计师
私信 提问
被忽视的ArrayList,你知道多少

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

键走偏锋
07/06
0
0
JAVA集合之ArrayList

一、前言 Java 集合类提供了一套设计良好的支持对一组对象进行操作的接口和类,JAVA常用的集合接口有4类,分别是: Collection:代表一组对象,每一个对象都是它的子元素 Set:不包含重复元素...

木木匠
09/24
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

没有更多内容

加载失败,请刷新页面

加载更多

初识flask

文档 0.10.1版本 http://www.pythondoc.com/flask/index.html 1.0.2版本 https://dormousehole.readthedocs.io/en/latest/ 安装flask $ pip3 install flaskCollecting flask Downloading......

yimingkeji
昨天
1
0
Akka系统《sixteen》译

Actor是一个封装状态(state)和行为(behavior)的对象,它们只通过交换消息通信(放入收件人邮箱的邮件)。从某种意义上说,Actor是最严格的面向对象编程形式,但它更适合将他们视为人:在与Act...

woshixin
昨天
1
0
技术工坊|如何开发一款以太坊钱包(深圳)

【好消息!】HiBlock区块链技术工坊已经成功举办了26期,其中北京1期,西安1期,成都2期,上海22期。经常有社区的小伙伴问定期举办技术工坊的除了上海以外,其他城市有没有?现在区块链技术工...

HiBlock
昨天
1
0
Redis 梳理笔记

安装 安装gccyum install gcc-c++下载传输到服务器上解压tar -xzvf *.tar.gzcd redis-3.2.9编译make安装 make PREFIX=/usr/local/redis install将配置文件拷贝出来cp redis...

晨猫
昨天
0
0
聊聊storm TridentWindowManager的pendingTriggers

序 本文主要研究一下storm TridentWindowManager的pendingTriggers TridentBoltExecutor.finishBatch storm-core-1.2.2-sources.jar!/org/apache/storm/trident/topology/TridentBoltExecut......

go4it
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部