繁体   English   中英

递归添加元素到 ArrayList 时并发修改异常

[英]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的瞬态变量,它跟踪列表在结构上被修改的次数。 结构修改是改变列表大小的修改,这可能会影响迭代的进度,并可能产生不正确的结果。 IteratorListIterator都使用此字段来检测意外更改。 List 的其他结构修改 List 的方法也使用此方法,例如add(), remove()

原因: ConcurrentModficationException的真正原因是modCount不一致。 当您迭代ArrayList时,迭代器的next()方法会跟踪modCount 如果您通过添加或删除元素来修改集合,则modCount将发生变化,并且与预期的modCount不匹配,因此 Iterator 将抛出ConcurrentModificationException

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM