拋concurrentmodificationexception異常!
foreach 寫法實際上是對的 iterable 、hasnext 、next 方法的簡寫。
因此我們從list.iterator() 著手分析,跟蹤 iterator() 方法,該方法返回了 itr 迭代器物件。
找到 list 的迭代器類
通過**我們發現 itr 是 arraylist 中定義的乙個私有內部類,
在 next、remove方法中都會呼叫 checkforcomodification 方法,該方法的作用是判斷 modcount != expectedmodcount是否相等,
如果不相等則丟擲concurrentmodificationexception異常。
每次正常執行 remove 方法後,都會對執行expectedmodcount = modcount 賦值,保證兩個值相等!
那麼問題基本上已經清晰了,在 foreach 迴圈中執行 list.remove(item);,
對 list 物件的 modcount 值進行了修改,而 list 物件的迭代器的 expectedmodcount 值未進行修改,因此丟擲了concurrentmodificationexception 異常。
list的remove方法刪除元素後執行了modcount++,但未對expectedmodcount 進行賦值
而 迭代器中 next方法首先需要檢查這兩個值是否相等,否則會丟擲異常。
final void checkforcomodification()map中remove
public final void remove()
package com.hsjry.convert.web.mvc.controller;
import j**a.util.*;
import j**a.util.concurrent.copyonwritearraylist;
/*** @author huangyanchang
* @date 2022/1/25 11:11
* @version 1.0
*/public class listremovetest
getremovelist1(list);
getremovelist2(list);
getremovelist3(list);
getremovelist4(list);
getremovemap1();
}private static void getremovemap1()
set keyset = map.keyset();
system.out.println(keyset.tostring());
iterator iterator=keyset.iterator();
while(iterator.hasnext())
object value = map.get(key);
system.out.println(key + " " + value);
/* [5, 6, 7, 8, 9]
5 null
6 1
7 2
8 3
9 4*/}}
private static void getremovelist4(listlist)
private static void getremovelist3(listlist)
}system.out.println("通過迭代器移除後的list元素:"+ list.tostring());
}private static void getremovelist2(listlist)
}system.out.println("通過物件移除後的list元素:"+ copylist.tostring());
}private static void getremovelist1(listlist)
}system.out.println("通過i--移除後的list元素:"+ list.tostring());
}}
List迴圈刪除集合
目錄 for迴圈遍歷list 增強for迴圈遍歷list 迭代器iterator的remove方法 建立新的物件新增值 刪除後list大小發生變化,因此索引發生變化,所以刪除的元素不是你想要的 解決辦法 倒著遍歷list集合 public static void main string args s...
集合 使用for迴圈刪除
1.使用for迴圈遍歷集合進行刪除 public static void main string args system.out.println strlist 結果 b,d 檢視當前 結果 輸出為b,d 只刪除了兩個元素 迴圈了幾次 3次 第一次 i 0 集合長度 為4,集合為 a,b,c,d 移...
如何在迴圈中刪除List集合中的元素
一 首先是最基本的for迴圈 for int i 0 iremove 方法刪除元素後會立刻更新list的size,因此index也發生了變化,會導致漏掉某些元素。解決辦法1 在刪除某乙個元素後直接break,當然這種情況只適合刪除乙個特定元素,不適合刪除多個元素。解決辦法2 index回退一位。如下...