java.util.ConcurrentModificationException
异常产生
当我们迭代一个ArrayList或者HashMap时,如果对集合做一些修改操作(例如删除元素),可能会抛出java.util.ConcurrentModificationException的异常。
例子:
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
for (String s : list) {
if (s.equals("B")) {
list.remove(s);
}
}
//foreach循环等效于迭代器
/*Iterator<String> iterator=list.iterator();
while(iterator.hasNext()){
String s=iterator.next();
if (s.equals("B")) {
list.remove(s);
}
}
*/
}
输出:
异常原因
ArrayList的父类AbstarctList中有一个域modCount
,每次对集合进行修改(增添元素,删除元素……)时都会modCount++
而foreach的背后实现原理其实就是Iterator,等同于上面代码的注释部分。在这里,迭代ArrayList的Iterator中有一个变量expectedModCount
,该变量会初始化和modCount
相等,但如果接下来如果集合进行修改modCount
改变,就会造成expectedModCount!=modCount
,此时就会抛出java.util.ConcurrentModificationException异常
异常的解决方法
可以使用Itr中的remove方法,实质也是调用了ArrayList中的remove,但增加了expectedModCount = modCount;
保证了不会抛出java.util.ConcurrentModificationException异常。(只适合用在单线程环境下)
Iterator<String> iter = list.iterator();
while(iter.hasNext()){
String str = iter.next();
if( str.equals("B") )
{
iter.remove();
}
}