阿里巴巴Java开发手册中,有这样一条规定:
并给出了两个例子
但为什么不能在foreach里增删操作呢,下面就来探讨一下
1.什么是foreach循环
定义:foreach循环是计算机编程语言中的一种控制流程语句,通常用来循环遍历数组或集合中的元素
引入版本:JDK 1.5
别名:增强for循环
特点:在遍历数组、集合等方面提供了极大的方便
语法格式:
for (元素类型i 元素变量item : 遍历对象obj) { //todo}
普通for循环 和 foreach循环对比:
先引入 ImmutableList的依赖
com.google.guava guava 27.0.1-jre
代码如下
输出结果:
idea也会建议我们用foreach替代for循环
用foreach语法遍历集合或者数组可以起到和普通for循环同样的效果,并且代码更加简洁
2.foreach循环原理
规范中指出不让我们在foreach循环中对集合元素做add/remove操作,用for循环和froeach循环分别测试一下
先用普通for循环对List进行遍历,删除List中的一个元素:
然后输出List,输出结果如下:
以上是使用普通的for循环在遍历的同时进行删除,接下来看看foreach循环:
注释掉原来for循环模块的代码,加上foreach:
运行程序,抛出异常 :
试试add方法
一样是报错(java.util.ConcurrentModificationException)
之所以会抛出这个异常,是因为触发了一个Java集合的错误检测机制——fail-fast
3.什么是fail-fast
定义:快速失败,Java集合的一种错误检测机制。
场景:当多个线程对集合(非fail-safe的集合类)进行结构上的改变的操作时,有可能会产生fail-fast机制,这个时候就会抛出ConcurrentModificationException( 当方法检测到对象的并发修改,但不允许这种修改时就抛出该异常),即使不是多线程环境,如果单线程违反了规则,同样也有可能会抛出这个异常
那foreach增删元素是怎样违反了这个规则呢,欲知后事如何,请听下回分解