如何解决递归地将元素添加到ArrayList时发生并发修改异常
在将元素递归添加到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;
}
}
我最近遇到了这个blog。
其中说,它使用一个名为modCount
的瞬态变量,该变量跟踪列表在结构上被修改的次数。结构修改是那些会更改列表大小的修改,它们可能会影响迭代的进度并可能产生错误的结果。 Iterator
和ListIterator
都使用此字段来检测意外更改。在结构上修改List的List的其他方法也使用此方法,例如add(),remove()
。
原因:ConcurrentModficationException
的真正原因与modCount
不一致。当您在ArrayList
上进行迭代时,Iterator的next()
方法将跟踪modCount
。如果您通过添加或删除元素来修改集合,则modCount
将发生变化,并且与预期的modCount
不匹配,因此Iterator会抛出ConcurrentModificationException
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。