[英]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.