日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:175日期: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 值是否相等,相等的話就返回遍歷;否則就拋出異常【ConcurrentModificationException】,終⽌遍歷

如果在循環(huán)中添加或刪除元素,是直接調(diào)用集合的add,remove方法【導致了modCount增加或減少】,但這些方法不會修改迭代實例中的expectedModCount,導致在迭代實例中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 機制,導致拋出ConcurrentModificationException 異常。

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

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

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

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

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

標簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
狠狠操综合网| 狠狠久久伊人中文字幕| 欧美一级网址| 欧美日韩亚洲一区三区| 欧美交a欧美精品喷水| 神马久久午夜| 亚洲在线成人| 国产成人精品亚洲线观看| 丁香六月综合| 日韩精品一二三区| 亚洲成av在线| 久久国内精品视频| 尤物网精品视频| 9色精品在线| 老牛影视一区二区三区| 国产精品久久久久av电视剧| 一区视频在线| 国产videos久久| 日韩在线观看一区二区三区| 欧美不卡高清一区二区三区| 国产欧美日韩精品一区二区三区| 国产高清一区二区| 精品视频91| 亚洲作爱视频| 国产日韩欧美一区二区三区 | 久久要要av| 精品欧美视频| 国产日韩欧美一区二区三区| 悠悠资源网久久精品| 国产精品成久久久久| 国产三级一区| 蜜臀91精品一区二区三区| 亚洲香蕉网站| 国产资源在线观看入口av| 青青草精品视频| 在线日韩一区| 99久久亚洲精品蜜臀| 福利欧美精品在线| 欧美成人精品午夜一区二区| 国产精品亚洲欧美日韩一区在线 | 鲁大师成人一区二区三区| 国产精品久久久一区二区| 日本少妇精品亚洲第一区| 欧美日韩伊人| 欧美精品91| 国产精品久久久久av蜜臀| 国产欧美一区二区三区米奇| 国产精品午夜av| 国产探花一区| 国产欧美日韩在线一区二区| 国产精品a级| 国产精品日本一区二区三区在线| 国产欧美丝祙| 不卡专区在线| 亚洲欧美日韩高清在线| 免费国产自线拍一欧美视频| 日本亚洲最大的色成网站www| 国产一卡不卡| 日韩av有码| 午夜av一区| 蜜臀精品一区二区三区在线观看| 日韩中文字幕91| 国产日韩欧美一区二区三区在线观看| 国产精品亚洲成在人线| 最新亚洲一区| 视频一区二区不卡| 91免费精品| 国产精品毛片久久久| 午夜亚洲精品| 日本高清不卡一区二区三区视频| 日本va欧美va瓶| 国产尤物精品| 成午夜精品一区二区三区软件| 91精品一区| 日韩视频中文| 国产欧美综合一区二区三区| 性欧美长视频| 亚洲综合丁香| 国产亚洲午夜| 在线亚洲观看| 欧美日韩四区| 亚洲精品一区二区妖精| 狠狠躁少妇一区二区三区| 中文一区一区三区高中清不卡免费| 久久人人精品| 日韩高清三区| 日韩三区在线| 久久爱www.| 亚洲天堂免费| 国产精品日韩精品中文字幕| 欧美日韩亚洲一区三区| 欧美精品97| 桃色av一区二区| 日韩三区免费| 亚欧洲精品视频在线观看| 免费视频一区二区| 99热精品在线观看| 亚洲精品在线二区| 国产一区二区三区网| 亚洲网站视频| 国产精品v日韩精品v欧美精品网站 | 欧美日韩91| 美女久久久久久| 老鸭窝毛片一区二区三区| 亚洲欧美日韩国产一区| 久久久久.com| 97久久超碰| 欧美日韩国产亚洲一区| 欧美日韩精品一本二本三本| 亚洲色图网站| 丝袜亚洲精品中文字幕一区| 久久最新视频| 麻豆精品在线| 欧美特黄一区| 国产极品一区| 五月婷婷六月综合| 亚洲欧洲美洲国产香蕉| 国产欧美一区二区色老头| 亚洲资源在线| 国产白浆在线免费观看| 日韩高清欧美激情| 国产精品婷婷| 亚洲一区网站| 国产 日韩 欧美一区| 日本电影久久久| 日本不卡一二三区黄网| 日本在线成人| 亚洲精品无吗| 国产精品激情电影| 欧美专区一区二区三区| 日韩三区免费| 国产伦精品一区二区三区视频| 日本综合视频| 美女亚洲一区| 91精品国产福利在线观看麻豆| 成人看片网站| 久久久久久夜| 国产成人精品999在线观看| 国产不卡精品| 精品五月天堂| 国产精品红桃| 国产一区二区三区日韩精品| 国产麻豆一区| 欧美日韩亚洲一区三区| 美女性感视频久久| 国产精品一区二区三区av麻| 欧美一区精品| 精品国产aⅴ| 91九色综合| 中文字幕日韩亚洲| 欧美日韩一区二区三区不卡视频 | 成人一区而且| 97在线精品| 久久精品欧洲| 麻豆精品视频在线观看| 国产欧美一区二区精品久久久| 久久国产精品成人免费观看的软件| 国产日韩视频| 国产欧美大片| 老色鬼精品视频在线观看播放| 日本免费一区二区三区四区| 日本精品另类| 欧美日韩中文| 久久久9色精品国产一区二区三区| 久久国产精品久久w女人spa| 久久激情综合网| 亚洲性视频h| 欧美日韩91| 欧美精品九九| 国产麻豆一区| 美女亚洲一区| 精品三级在线观看视频| 少妇精品导航| 亚洲精品激情| 亚洲小说欧美另类婷婷| 国产人成精品一区二区三| 久久美女性网| 国产精品sm| 日本成人中文字幕在线视频| 欧美在线亚洲综合一区| 日本不良网站在线观看| 国产精品欧美一区二区三区不卡 | 亚洲青青久久| 久久精品国产www456c0m| 久久伊人国产| 国产精品自拍区| 日韩av网站在线免费观看| 男女男精品网站| 麻豆9191精品国产| 欧美亚洲激情| 中文字幕系列一区| 精品国产一区二区三区av片| 国产精品久久亚洲不卡| 国产美女久久| 国产精品视频一区二区三区综合 | 人在线成免费视频| 伊人久久视频| 在线天堂中文资源最新版| 国产精品地址| 精品成人18|