ArrayList 的 isEmpty() 方法上的 ConcurrentModificationException

TEX*_*HIK 4 java arraylist concurrentmodification java-7

我有以下代码:

Map<String, List<String>> map;
for(String k : map.keySet()){
   List<String> list = map.get(k);
   boolean empty = list.isEmpty();//CME
   if(!empty && somecheck(k, ...)){
      list.clear();
   }
}
Run Code Online (Sandbox Code Playgroud)

我正在ConcurrentModificationException使用 isEmpty() 方法。列表是一个ArrayList. 没有其他线程修改列表,因为它之前是在此方法中创建的(以及所有映射)。唯一修改列表的地方是clear(),但它在 isEmpty() 之后调用并且循环不能在一个列表上执行两次。

我正在使用 Java 1.7

java.util.ConcurrentModificationException
    at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1169)
    at java.util.ArrayList$SubList.size(ArrayList.java:998)
    at java.util.AbstractCollection.isEmpty(AbstractCollection.java:86)
Run Code Online (Sandbox Code Playgroud)

Bar*_*W19 5

从您提供的堆栈跟踪来看,似乎在实现 SubList 功能的子类中抛出了异常 - 我假设您的地图中的列表实际上是另一个列表的子列表?

大概发生的事情是您在创建子列表视图后修改了底层列表(请记住,子列表只是另一个列表的视图 - 它不需要独立的副本)。

不要将子列表放入地图中,而是尝试复制,例如:

map.put(key, new ArrayList(originalList.subList(start, end));
Run Code Online (Sandbox Code Playgroud)