这篇文章显示了解决java.util.ConcurrentModificationExceptionfor 的问题ArrayList。
该错误消息如下所示:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
...
...
问题
您可能要遍历ArrayList,并在某些特定条件下删除某些元素。例如,以下代码看起来很合理:
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
for (String s : list) {
if (s.equals("B")) {
list.remove(s);
}
}
实际上,运行代码将导致以下异常:
解决方案1
Iterator可以用来解决这个问题。Iterators允许调用者在迭代过程中从基础集合中删除元素。
Iterator<String> iter = list.iterator();
while(iter.hasNext()){
String str = iter.next();
if( str.equals("B")){
iter.remove();
}
}
解决方案2
代替ArrayList,CopyOnWriteArrayList可以用来解决问题。CopyOnWriteArrayList是线程安全的变体,ArrayList其中所有可变操作(添加,设置等)都通过对基础数组进行全新复制来实现。
List<String> list = new CopyOnWriteArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
for (String s : list) {
if (s.equals("B")) {
list.remove(s);
}
}
其他数据结构(例如HashSet,LinkedList等)也是如此。