ConcurrentModificationException - checkForCommodification(ArrayList.java)

Rag*_*ghu 1 java arraylist hashmap

对于下面带有哈希映射的java程序,抛出ConcurrentModification异常,我已经在程序中标记了抛出异常的行。

我暂时跳过了将数据插入 HashMap 的登录

import java.util.ArrayList;
 import java.util.HashMap;

 public class MainClass {

     public static void main(String[] args) {

         ArrayList<HashMap<String, ArrayList<String>>> arrMain = new ArrayList<HashMap<String, ArrayList<String>>>();

         HashMap<String, ArrayList<String>> hm = new HashMap<String, ArrayList<String>>();

         ArrayList<String> strings = new ArrayList<String>();

         // Code to build the above Maps with all required Data, Skipped for Now

         //******************Scenario 1****************
         for (HashMap<String, ArrayList<String>> dataMap : arrMain) { //ConcurrentModification Exception
             for (String s : dataMap.get("Key")) {
                 ArrayList<String> newStrings = new ArrayList<String>();
                 newStrings.addAll(dataMap.get("Key")); 
                 newStrings.add("New String");
                 dataMap.put("Key", newStrings);
             }

         }

         //******************Scenario 2****************
         for (HashMap<String, ArrayList<String>> dataMap : arrMain) {//ConcurrentModification Exception
             for (String s : dataMap.get("Key")) {
                 dataMap.get("Key").add("New String"); 
             }

         }

     }

 }
Run Code Online (Sandbox Code Playgroud)

错误 :

java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
    at java.util.ArrayList$Itr.next(ArrayList.java:791)
Run Code Online (Sandbox Code Playgroud)

Ruc*_*era 5

当您尝试在迭代时修改集合时,您将得到ConcurrentModificationException. 您可以尝试Iterator避免这种情况。

例如:IteratorMap

    Map<String, String> map = new HashMap<>();
    map.put("a", "a1");
    map.put("b", "b1");
    map.put("c", "c1");
    System.out.println(map);
    Iterator it = map.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pairs = (Map.Entry) it.next();
        System.out.println(pairs.getKey() + " = " + pairs.getValue());
        it.remove(); // no a ConcurrentModificationException
    }
    System.out.println(map);
Run Code Online (Sandbox Code Playgroud)

输出:

{b=b1, c=c1, a=a1}
b = b1
c = c1
a = a1
{}
Run Code Online (Sandbox Code Playgroud)