文档章节

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

冷冷gg
 冷冷gg
发布于 2017/02/16 13:29
字数 234
阅读 103
收藏 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
粉丝 365
博文 110
码字总数 49926
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
30分钟前
2
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
34分钟前
1
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
35分钟前
1
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
41分钟前
1
0
使用xtrabackup完成远程备份

转载收藏,以防丢失 需求 Can I backup remote databases from my local server02-27-2013, 06:17 AMHi, I am using mysqldump so far for taking daily backups of my Production datab......

阿dai
47分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部