[英]Why removing element from list using iterator causes ConcurrentModificationException?
[英]ConcurrentModificationException When removing element using list iterator java
即使使用迭代器,我在刪除列表的第一個和第二個元素時也遇到問題。
我已閱讀以下線程,但無法解決我的問題(那些是最相關的,但我也檢查了其他材料):
嘗試從列表中刪除元素時出現 ConcurrentModificationException
遍歷集合,在循環中刪除對象時避免 ConcurrentModificationException
所以我的代碼看起來像這樣:
List<List<String>> list = cnf.read();
List<List<String>> nlist = new ArrayList<>();
for (List<String> l : list) {
if (l.size() <= 3) {
nlist.add(l);
} else {
int size = l.size();
while (size > 3) {
List<String> three = l.subList(0, 2);
three.add("Y" + (count++));
//Iterator itr = l.iterator();
ListIterator itr = l.listIterator();
int v = 0;
while (itr.hasNext()) {
itr.next();
if (v == 0 || v == 1) {
itr.remove();
v++;
}
}
l.add(0, "Y" + (count++));
size--;
nlist.add(three);
}
nlist.add(l);
}
}
for (List<String> l : nlist) {
System.out.println(l.toString());
System.out.println(l.size());
}
我在此處的打印語句中收到 ConcurrentModificationException :
System.out.println(l.toString());
我也嘗試在我的 2 個 for 循環中使用迭代器,但似乎沒什么區別! 我是發布問題的新手,所以如果我做對了,請告訴我! 謝謝你。
經過長時間的調試,這里是解決方案。
sublist 函數通過引用而不是通過值傳遞,由 ArrayList.subList 調用創建的子列表保留對原始列表的引用並直接訪問其 elementData 數組。
出於這個原因,當向“三”列表添加一個元素時,我們改變了原始列表的狀態。 這發生在這里:
三.add("Y" + (count++));
針對這種特定情況修復它的一種方法是通過以下方式創建和初始化“三個”列表:
String one = l.get(0);
String two = l.get(1);
List<String> three = new ArrayList<>();
three.add(one);
three.add(two);
three.add("Y" + (count));
這允許我們在不獲得並發異常 (ConcurrentModificationException) 的情況下操作我們的列表。 但是,如果您要操作大列表,我建議您使用另一種不太硬編碼的方法來創建列表。
我會將這個帖子標記為已回答,希望對人們有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.