大家先看看如下示例:
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("111");
list.add("111");
list.add("111");
list.add("333");
list.add("333");
for (String str : list){
if("111".equals(str)){
list.remove(str);//抛出异常java.util.ConcurrentModificationException
}
}
}
为什么会抛出ConcurrentModificationException异常呢,因为这其中和modCount与exceptModCount有关,在遍历开始的时候会赋值一个exceptModCount,在遍历的过程中会判断modCount与exceptModCount是否相等,如果不等,则抛出异常,然而迭代器本身是在遍历的时候会修改modCount和expectedModCount,所以不会报错,如下所示:
List<String> list = new ArrayList<String>();
list.add("111");
list.add("111");
list.add("111");
list.add("333");
list.add("333");
/*for (String str : list){
if("111".equals(str)){
list.remove(str);//抛出异常java.util.ConcurrentModificationException
}
}*/
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String str = iterator.next();
if("111".equals(str)){
iterator.remove();
}
}
查看arraylist对源代码如下:
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}