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

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

先来看看《阿里巴巴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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Security OAuth2 实现登录互踢

    一个账号只能一处登录,类似的业务需求在现有后管类系统是非常常见的。 但在原有的 spring security oauth2 令牌方法流程(所谓的登录)无法满足...

    冷冷
  • 【小技巧】spring security oauth2 令牌实现多终端登录状态同步

    解决不同客户端使用token,各个客户端的登录状态必须保持一致,退出状态实现一致。同上述问题类似如何解决不同租户相同用户名的人员的登录状态问题。

    冷冷
  • 「starter推荐」简单高效Excel 导出工具

    EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 64M内存1分钟内读取75M(...

    冷冷
  • Eclipse配置C++11环境详细介绍

    转:https://blog.csdn.net/wgxh05/article/details/54021049

    墨文
  • 利用Jsoup解析网页,抓取数据的简单应用

    最近一直在公司利用爬虫技术,去抓取一些网页查询网站备案信息,刚开始使用HttpClient 和 jericho (这两个也挺好用你可以去测试一下)。但是后来发现...

    用户5166556
  • 用python绘制有效前沿

    投资中最关心的两个问题是预期收益与风险,当对多个资产进行投资时,如何测定组合的风险与收益,如何根据这两项指标进行资产权重配置? 马科维茨理论给出了解决这一问题的...

    量化小白
  • 使用码云(gitee)撸一个免费图床V2.0

    第一版已完成,这篇文章是在第一版的基础上进行改造升级了。第一版的详细文章请见>>>https://blog.csdn.net/pyfysf/article/de...

    趣学程序-shaofeer
  • CNN推理哪家强?英伟达/英特尔/骁龙/麒麟/ActionSemi大测评

    CNN推理在物联网的趋势下越来越重要,各大品牌也在推出不同设备以供使用。那么,主流品牌硬件做CNN推理哪家强?

    量子位
  • leetcode之最常见的单词

    这里使用Map来统计单词,并使用Set来查询是否为禁用词,若为禁用词则不加入Map中统计,最后遍历Map取出计数最大的单词。

    codecraft
  • 通过spring实现javamail的那些事儿

    以前很早的时候大家都用javamail实现发送邮件的功能,而且我们也一直沿用至今,代码拷过来用用就行了,现在我们改为用spring来实现,这样一来减少代码的复杂...

    风间影月

扫码关注云+社区

领取腾讯云代金券