簡體   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