首页 欧洲联赛正文

这节来聊聊foreach循环进行元素增删,是如何违反了fail-fast规则的

fail-fast 机制是java集合(Collection)中的一种错误机制。当陈十四传奇多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件

例如:当某一个线程A通过iterator去遍历某集合的过程中,上海天气24小时若该集合的内容被其他线程所改变了;

那么线程A访问集合时,会抛出ConcurrentModificationException异常,导致fail-fast事件

先说foreach循环原理:

1.foreach循环(Java)是根据list对象创建一个Iterator迭代对象

2.Iterator对象遍历list,对list进行增删操作,必须经过Iterato玄灵界r,否则Iterator遍历时会乱,

所以直接对list钉子渣户进行删除时,会抛出ConcurrentModificationException异常

下面通过代码去验证一下

先下个IdeaJad插件

反编译(Decompiled)上文的foreach循环俞飞鸿固定伴侣是谁的class文件,可得

这段代码不出所料,还是会抛出异常

每次foreach迭代的时候都有两步操作:
1. iterator.hasNext() //判断是否有下个元素
2. item = iterator.next() //下个元素是什么,并赋王浩轩沙海值给上面例子中的item变量

那究竟是哪个方法出的问题呢,可以先设置三个断点

debug的时候定位到ListIterator方法

可以看到当modCount和expectedModCount不等时,就会抛德川喜喜出异常

那么这个modCount和expectedModCount表示什么?

modCount:ArrayList中的一个成员变量,表示list对象从创建(new)到当前被修改的次数,当调用List的add或者remove方法的时候苏门答腊鼠猴,modCount都会增加

expectedModCoun苏州旺道seot:ArrayList中的一个内部类Iterator的成员变量,现在期望这个list被修改的次数是多少次

iterator创建的时候modCount被赋值给了expectedModCount,调用list的add和remove方法的时候不会同时修改expectedModCount

这样就导致下次取值时检查到两个值不等,从而导致异常

看看调用add方法的时候发生了什么(remove同理):

进入ensureCapacityInter柳二街0nal方法

再进入ensureExplicitCapacity方法

这里modCount自增1,expectedModCount不变,因此会导致两个值不同

那么怎么解决这个问题呢,下面的方法可以解决你的烦恼

1.使用普通for循环

这个上文已经讲过了,普通for循环没用到Iterator摸女生下面的张震岳当爸遍历,因此没有fail-fast的检验,此处不再赘述

2.Iterator操作集合

除了直接使用普通for循环以外,直接使用Iterator提供的remove方法

直接使用Iterator提供的remove方法,这个时候再给expectedModCount赋值(modCount),使两值相姐姐不要啊同,就不会再草避图r抛出异常了

3.filter过滤

Java 8中filter过滤属性,把集合转换成流,对于流有一种filter操作,通过测试的元素被留下来生成一个新 Stream

在Java中除了一些普通的集合类以外,还有一些采用了fail-safe机制的集合类。

这样玻利维亚,有什么好看的电视剧,行李箱尺寸的集合容器在遍历时不是直接在集合内容上访问的,

而是先复制原有集合内容,在拷贝孟玲师生音乐会的集合上进行遍历。

由于迭代时是对原集合的花蛇邀请码拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发ConcurrentModificationException。

5.只增删一个元素,加break,代码不会执行下一驴交次next(ava视频)

总结一下张云成,如果遇到需要循环中增删元素的情况,可以采用以下方案:

1.普通for循环

2.foreach循环里面只调用一次remove/add方法,加个break中止循环

3.使用Iterator增减

4.使用Stream的filter

5.使用ConcurrentLinkedDeque类创建集合

先到这里了~~

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

花粥,诚赢股份股东石峰增持40万股 权益变化后持股份额为8.32%,成都地图

  • 中国邮政快递,福克斯新闻董事长涉性丑闻辞去职务 默多克亲身接任,三角形

  • 三阶魔方公式,洲明科技股东户数添加13.57%,户均持股32.63万元,石墨烯电池

  • 长沙银行,我院参与全国第四次中药资源普查活动写实(一),江西人事考试网

  • 黑科技,北京海淀一高级小区被盗500万+67万美元+16公斤黄金,360彩票

  • 风景壁纸,【韩国小众彩妆引荐】越冷越神仙!(中篇),vase

  • mo,原创家长:孩子立刻一年级了,过教师节给教师买礼物吗?教师:没必要,得

  • 素描入门,万业企业董事长朱旭东:掌握集成电路国产化机会,u9