我有以下代码:
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)
答案 0 :(得分:3)
从你给出的堆栈跟踪看来,在实现SubList功能的子类中抛出了异常 - 我假设地图中的列表实际上是另一个列表的子列表?
据推测,正在发生的是您在创建子列表视图后修改基础列表(请记住,子列表只是另一个列表的视图 - 它不需要独立的副本)。
不要将子列表放入地图中,而是尝试复制,例如:
map.put(key, new ArrayList(originalList.subList(start, end));