[英]Concurrent Modification Exception while adding elements to ArrayList recursively
遞歸地向 ArrayList 添加元素時出現並發修改異常。
import java.util.*;
public class Hello {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
String str = sc.next();
System.out.println(gss(str));
}
public static ArrayList<String> gss(String str) {
if(str.length() == 0){
ArrayList<String> list = new ArrayList<String>();
list.add("");
return list;
}
ArrayList<String> list = gss(str.substring(1));
for(String temp : list){
list.add(str.charAt(0)+temp); // Problem
}
return list;
}
}
解決方案:只需在每個調用堆棧處形成新的 ArrayList 並返回它。
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
String str = sc.next();
System.out.println(gss(str));
}
public static ArrayList<String> gss(String str) {
if(str.length() == 0){
ArrayList<String> list = new ArrayList<String>();
list.add("");
return list;
}
ArrayList<String> list = gss(str.substring(1));
ArrayList<String> listToReturn = new ArrayList<>();
for(String temp : list){
listToReturn.add(temp);
}
for(String temp : list){
listToReturn.add(str.charAt(0) + temp);
}
return listToReturn;
}
}
我最近遇到了這個博客。
這就是說,它使用一個名為modCount
的瞬態變量,它跟蹤列表在結構上被修改的次數。 結構修改是改變列表大小的修改,這可能會影響迭代的進度,並可能產生不正確的結果。 Iterator
和ListIterator
都使用此字段來檢測意外更改。 List 的其他結構修改 List 的方法也使用此方法,例如add(), remove()
。
原因: ConcurrentModficationException
的真正原因是modCount
不一致。 當您迭代ArrayList
時,迭代器的next()
方法會跟蹤modCount
。 如果您通過添加或刪除元素來修改集合,則modCount
將發生變化,並且與預期的modCount
不匹配,因此 Iterator 將拋出ConcurrentModificationException
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.