foreach变量list_为何阿里禁止foreach里面进行增删操作(上)

12fbc535cb152b9a2fcebc22e9915f78.png

阿里巴巴Java开发手册中,有这样一条规定:

1928652fdbe33ce72d1c98fc56ab7819.png

并给出了两个例子

722910f2aadab4093ef9b4473a566aa6.png

但为什么不能在foreach里增删操作呢,下面就来探讨一下

1.什么是foreach循环

定义:foreach循环是计算机编程语言中的一种控制流程语句,通常用来循环遍历数组或集合中的元素

引入版本:JDK 1.5

别名:增强for循环

特点:在遍历数组、集合等方面提供了极大的方便

语法格式:

for (元素类型i 元素变量item : 遍历对象obj) { //todo}

普通for循环foreach循环对比:

先引入 ImmutableList的依赖

com.google.guava guava 27.0.1-jre

代码如下

d75142a9ba469911fafeb21da297084f.png

输出结果:

fc3e7dbad6be3065f22abddf94e83f0c.png

idea也会建议我们用foreach替代for循环

a3a78f7a9dbd9eb8b5fdfb286a78bf59.png

用foreach语法遍历集合或者数组可以起到和普通for循环同样的效果,并且代码更加简洁

2.foreach循环原理

规范中指出不让我们在foreach循环中对集合元素做add/remove操作,用for循环和froeach循环分别测试一下

先用普通for循环对List进行遍历,删除List中的一个元素:

c39f05bf16e5a6283a04a75707d2cbd8.png

然后输出List,输出结果如下:

db3decd90a32fd25692c72c6049b6ce3.png

以上是使用普通的for循环在遍历的同时进行删除,接下来看看foreach循环:

注释掉原来for循环模块的代码,加上foreach:

0144ed6aa551dbd0183553d5a73c7d3a.png

运行程序,抛出异常 :

9f75025d4531d352afbff958f554667d.png

试试add方法

606968292e371e0ff195185283162c46.png

一样是报错(java.util.ConcurrentModificationException)

64a7b971a384328b74a2db6faea54232.png

之所以会抛出这个异常,是因为触发了一个Java集合的错误检测机制——fail-fast

3.什么是fail-fast

定义:快速失败,Java集合的一种错误检测机制。

场景:当多个线程对集合(非fail-safe的集合类)进行结构上的改变的操作时,有可能会产生fail-fast机制,这个时候就会抛出ConcurrentModificationException( 当方法检测到对象的并发修改,但不允许这种修改时就抛出该异常),即使不是多线程环境,如果单线程违反了规则,同样也有可能会抛出这个异常

那foreach增删元素是怎样违反了这个规则呢,欲知后事如何,请听下回分解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值