电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

為什么在foreach循環(huán)中JAVA集合不能添加或刪除元素

瀏覽:89日期:2022-08-10 17:45:49
目錄1. 編碼強制規(guī)約2. 原因分析3. 相關(guān)知識介紹3.1. 什么是快速失敗(fail-fast)?3.2. 什么是安全失敗(fail-safe)呢?1. 編碼強制規(guī)約

在《阿里巴巴Java開發(fā)手冊》中,針對集合操作,有一項規(guī)定,如下:

【強制】不要在 foreach 循環(huán)里進行元素的 remove/add 操作。remove 元素請使用 Iterator方式,如果并發(fā)操作,需要對 Iterator 對象加鎖。

public class SimpleTest { public static void main(String[] args) {List<String> list = Lists.newArrayList();list.add('1');list.add('2');list.add('3');list.add('4'); //正例Iterator<String> iterator = list.iterator();while (iterator.hasNext()) { String item = iterator.next(); if ('1'.equalsIgnoreCase(item)) {iterator.remove(); }} //反例for (String item : list) { if ('2'.equals(item)) {list.remove(item); }} }}2. 原因分析

在循環(huán)或迭代時,會首先創(chuàng)建一個迭代實例,這個迭代實例的expectedModCount 賦值為集合的modCount.

每當?shù)魇?#12132; hashNext() / next() 遍歷下⼀個元素之前,都會檢測 modCount 變量與expectedModCount 值是否相等,相等的話就返回遍歷;否則就拋出異?!綜oncurrentModificationException】,終⽌遍歷

如果在循環(huán)中添加或刪除元素,是直接調(diào)用集合的add,remove方法【導(dǎo)致了modCount增加或減少】,但這些方法不會修改迭代實例中的expectedModCount,導(dǎo)致在迭代實例中expectedModCount 與 modCount的值不相等,拋出ConcurrentModificationException異常

但迭代器中的remove,add方法,會在調(diào)用集合的remove,add方法后,將expectedModCount 重新賦值為modCount,所以在迭代器中增加、刪除元素是可以正常運行的。

可以參考ArrayList中的內(nèi)部私有類Itr、ListItr的源碼

public Iterator<E> iterator() {return new Itr(); } /** * An optimized version of AbstractList.Itr */ private class Itr implements Iterator<E> {int cursor; // index of next element to returnint lastRet = -1; // index of last element returned; -1 if no suchint expectedModCount = modCount; Itr() {} //刪除了一些代碼 public void remove() { if (lastRet < 0)throw new IllegalStateException(); checkForComodification(); try {ArrayList.this.remove(lastRet);cursor = lastRet;lastRet = -1;expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) {throw new ConcurrentModificationException(); }} final void checkForComodification() { if (modCount != expectedModCount)throw new ConcurrentModificationException();} } public E remove(int index) {rangeCheck(index); modCount++;E oldValue = elementData(index); int numMoved = size - index - 1;if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved);elementData[--size] = null; // clear to let GC do its work return oldValue; }3. 相關(guān)知識介紹3.1. 什么是快速失敗(fail-fast)?

快速失敗(fail-fast) 是 Java 集合的⼀種錯誤檢測機制。在使⽤迭代器對集合進⾏遍歷的時候,在多線程下操作⾮安全失敗(fail-safe)的集合類可能就會觸發(fā) fail-fast 機制,導(dǎo)致拋出ConcurrentModificationException 異常。

另外,在單線程下,如果在遍歷過程中對集合對象的內(nèi)容進⾏了修改的話也會觸發(fā) fail-fast 機制。

舉個例⼦:多線程下,如果線程 1 正在對集合進⾏遍歷,此時線程 2 對集合進⾏修改(增加、刪除、修改),或者線程 1 在遍歷過程中對集合進⾏修改,都會導(dǎo)致線程 1 拋出ConcurrentModificationException 異常。

3.2. 什么是安全失敗(fail-safe)呢?

采⽤安全失敗機制的集合容器,在遍歷時不是直接在集合內(nèi)容上訪問的,⽽是先復(fù)制原有集合內(nèi)容,在拷⻉的集合上進⾏遍歷。所以,在遍歷過程中對原集合所作的修改并不能被迭代器檢測到,故不會拋ConcurrentModificationException 異常。

到此這篇關(guān)于為什么在foreach循環(huán)中JAVA集合不能添加或刪除元素的文章就介紹到這了,更多相關(guān)JAVA集合添加或刪除元素內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Java
相關(guān)文章:
主站蜘蛛池模板: 柔软云母板-硬质-水位计云母片组件-首页-武汉长丰云母绝缘材料有限公司 | 【化妆品备案】进口化妆品备案流程-深圳美尚美化妆品有限公司 | 欧必特空气能-商用空气能热水工程,空气能热水器,超低温空气源热泵生产厂家-湖南欧必特空气能公司 | 沈阳网站建设_沈阳网站制作_沈阳网页设计-做网站就找示剑新零售 沈阳缠绕膜价格_沈阳拉伸膜厂家_沈阳缠绕膜厂家直销 | 精密钢管,冷拔精密无缝钢管,精密钢管厂,精密钢管制造厂家,精密钢管生产厂家,山东精密钢管厂家 | 冷藏车-东风吸污车-纯电动环卫车-污水净化车-应急特勤保障车-程力专汽厂家-程力专用汽车股份有限公司销售二十一分公司 | [品牌官网]贵州遵义双宁口腔连锁_贵州遵义牙科医院哪家好_种植牙_牙齿矫正_原华美口腔 | 安徽集装箱厂-合肥国彩钢结构板房工程有限公司 | 沈阳真空机_沈阳真空包装机_沈阳大米真空包装机-沈阳海鹞真空包装机械有限公司 | 间甲酚,间甲酚厂家-山东祥东新材料 | UV固化机_UVLED光固化机_UV干燥机生产厂家-上海冠顶公司专业生产UV固化机设备 | 天品互联-北京APP开发公司-小程序开发制作-软件开发 | 一技任务网_有一技之长,就来技术任务网 | 注塑模具_塑料模具_塑胶模具_范仕达【官网】_东莞模具设计与制造加工厂家 | 面粉仓_储酒罐_不锈钢储酒罐厂家-泰安鑫佳机械制造有限公司 | 电梯乘运质量测试仪_电梯安全评估测试仪-武汉懿之刻 | 活性炭-果壳木质煤质柱状粉状蜂窝活性炭厂家价格多少钱 | 软膜天花_软膜灯箱_首选乐创品牌_一站式天花软膜材料供应商! | 河南橡胶接头厂家,河南波纹补偿器厂家,河南可曲挠橡胶软连接,河南套筒补偿器厂家-河南正大阀门 | 防勒索软件_数据防泄密_Trellix(原McAfee)核心代理商_Trellix(原Fireeye)售后-广州文智信息科技有限公司 | 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 阿里巴巴诚信通温州、台州、宁波、嘉兴授权渠道商-浙江联欣科技提供阿里会员办理 | 精雕机-火花机-精雕机 cnc-高速精雕机-电火花机-广东鼎拓机械科技有限公司 | 时代北利离心机,实验室离心机,医用离心机,低速离心机DT5-2,美国SKC采样泵-上海京工实业有限公司 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 干式变压器厂_干式变压器厂家_scb11/scb13/scb10/scb14/scb18干式变压器生产厂家-山东科锐变压器有限公司 | 英超直播_英超免费在线高清直播_英超视频在线观看无插件-24直播网 | ET3000双钳形接地电阻测试仪_ZSR10A直流_SXJS-IV智能_SX-9000全自动油介质损耗测试仪-上海康登 | 北京中航时代-耐电压击穿试验仪厂家-电压击穿试验机 | 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 滤芯,过滤器,滤油机,贺德克滤芯,精密滤芯_新乡市宇清流体净化技术有限公司 | 圣才学习网-考研考证学习平台,提供万种考研考证电子书、题库、视频课程等考试资料 | NMRV减速机|铝合金减速机|蜗轮蜗杆减速机|NMRV减速机厂家-东莞市台机减速机有限公司 | 深圳彩钢板_彩钢瓦_岩棉板_夹芯板_防火复合彩钢板_长鑫 | 游动电流仪-流通式浊度分析仪-杰普仪器(上海)有限公司 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 钢制拖链生产厂家-全封闭钢制拖链-能源钢铝拖链-工程塑料拖链-河北汉洋机械制造有限公司 | 涂层测厚仪_光泽度仪_uv能量计_紫外辐照计_太阳膜测试仪_透光率仪-林上科技 | 编织人生 - 权威手工编织网站,编织爱好者学习毛衣编织的门户网站,织毛衣就上编织人生网-编织人生 | 冷藏车厂家|冷藏车价格|小型冷藏车|散装饲料车厂家|程力专用汽车股份有限公司销售十二分公司 | 电脑刺绣_绣花厂家_绣花章仔_织唛厂家-[源欣刺绣]潮牌刺绣打版定制绣花加工厂家 | 单电机制砂机,BHS制砂机,制沙机设备,制砂机价格-正升制砂机厂家 单级/双级旋片式真空泵厂家,2xz旋片真空泵-浙江台州求精真空泵有限公司 |