collection中使用增强for循环时删除出错的分析

    在对集合使用增强for循环时会发现在for循环中对集合的删除动作会抛出异常

java.util.ConcurrentModificationException

    为什么会出现这种情况?

    以list为例,因为增强for循环实际上是将根据list对象来创建一个iterator迭代对象,有着额迭代对象来遍历list,等于是list的元素全部由iterator来操作,对任何list元素的操作都是由iterator来完成的。而对iterator的操作有两个方法来决定

    hasNext()   //判断是否由下一个元素
    next()      //取下一个元素

 hasNext():

public E next() {
        checkForComodification();
        try {
                E next = get(cursor);
                lastRet = cursor++;
                return next;
        } catch (IndexOutOfBoundsException e) {
                checkForComodification();
                throw new NoSuchElementException();
        }
}
 
final void checkForComodification() {
        if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }
}

    其中

    modCount表示list对象生成后对他的修改次数,当list的remove和add方法执行时,modCount自增

    expectedModCount表示Iterator现在期望list被修改的次数

    iterator建立时modCount被赋值给了expectedModCount,expectedModCount是不会改变的,而modCount随着add/remove发生改变,于是抛出

new ConcurrentModificationException()

(当然以上的思路都是建立在list没有被多线程共享的情况下)

  参考--http://rongmayisheng.com/post/破除迷信java-util-arraylist在foreach循环遍历时可以删除元素



你可能感兴趣的:(删除,iterator,增强for循环,抛异常)