增强for底层用了迭代器,会导致遍历的时候修改集合中的元素出现java.util.ConcurrentModificationException,这是因为ArrayList底层维护了一个modCount用于记录list集合修改的次数,每操作一次就会加一,而我们迭代器开始的时候会记录这个值,每次迭代的时候都会比较这个值与目前实际的值是否相同,如果有其他线程或者自身线程在遍历的时候操作了这个list,那么这个modCount就会发生变化,一旦迭代器在迭代的时候发现了这两个值不一样就会报这个异常。
用 CopyOnWriteArrayList<>()可以解决问题,具体是因为CopyOnWriteArrayList<>()底层在迭代的时候,迭代器内部保留了原来的list集合,当迭代的时候i操作这个list集合,它在底层会克隆一个新的和原来一样的list集合,然后操作克隆出来的list集合,再把新的list集合赋值给原来的list集合,而整个过程中迭代器内部的list集合始终都是老的list集合。
list的线程安全的集合vector也会出现这个异常。
package com.dongmu;
import java.util.ArrayList;
import java.util.Vector;
public class iterable {
public static void main(String[] args) {
/*ArrayList<Integer> list = new ArrayList<>();
list.add(12);
list.add(13);
list.add(14);
for (Integer o : list) {
System.out.println(o);
if (o==12){
list.remove(2);
}
}*/
Vector<Integer> vector = new Vector<>();
vector.add(12);
vector.add(13);
vector.add(14);
vector.add(15);
for (Integer integer : vector) {
System.out.println(integer);
if (integer==13){
vector.remove(2);
}
}
}
}