ArrayList的isEmpty()方法的ConcurrentModificationException

时间:2017-05-31 09:54:28

标签: java arraylist java-7 concurrentmodification

我有以下代码:

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();
   }
}

我在isEmpty()方法中获得ConcurrentModificationException。列表是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)

1 个答案:

答案 0 :(得分:3)

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

据推测,正在发生的是您在创建子列表视图后修改基础列表(请记住,子列表只是另一个列表的视图 - 它不需要独立的副本)。

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

map.put(key, new ArrayList(originalList.subList(start, end));