不要在 foreach 循環裏進行元素的 remove/add 操做。remove 元素請使用 Iterator 方式,若是併發操做,須要對 Iterator 對象加鎖。 java
正例: Iterator<String> iterator = list.iterator(); 數組
while (iterator.hasNext()) { 併發
String item = iterator.next(); .net
if (刪除元素的條件) { 對象
iterator.remove(); blog
} 索引
} rem
反例: List<String> list = new ArrayList<String>(); 編譯器
list.add("1"); it
list.add("2");
for (String item : list) {
if ("1".equals(item)) {
list.remove(item);
}
}
說明:以上代碼的執行結果確定會出乎你們的意料,那麼試一下把「1」換成「2」,會是一樣的 結果嗎?
根本緣由在於expectedModCount與modCount他們的不相等,因爲執行了ArrayList中的remove(),modCount在每一次循環值會發生改變,而expectedModCount並無發生,在執行checkForComodification()方法就會拋出異常。
以下代碼:編譯器編譯後的代碼以下:}首先你們應該瞭解,對集合作remove,and等操做會觸修改次數(modCount)的增長。如下是集合實現的Iterator.hasNext()方法cursor:下一個元素的索引位置(調用Interator.next()是會觸發cursor+1)size:集合長度總結:若是咱們咱們用foreach刪除的元素恰好是最後一個,刪除完成前cursor恰好等於size的大小。可是,刪除完成後size的數量減1,可是cursor並無變化。致使下一次循環不相等繼續向下執行,致使檢查數組不經過,拋出java.util.ConcurrentModificationException爲何使用下面的方法就不會出現這種狀況:請看箭頭所指處:foreach是直接調用集合的刪除方法,而上面是調用iterator的刪除方法:相信你們一看便知!1.首先檢查集合2.刪除元素3.cursor從新賦值4.檢查集合參數從新賦值--------------------- 做者:這我的好帥 來源:CSDN 原文:https://blog.csdn.net/weixin_39032575/article/details/80724984 版權聲明:本文爲博主原創文章,轉載請附上博文連接!