并发修改异常,我在回答别人的类似的问题里贴过.
ArrayList继承于AbstractList类
这个类中有一个内部类叫Itr,作用是返回一个Iterator接口的实例,在这个内部类中,包含一个 modCount(modify count 修改次数)变量,它的初始值是0,当集合每被修改一次时(调用add,remove等方法),modCount加1。因此,modCount如果不 变,表示集合内容未被修改。
另外,还有一个叫expectedModCount(expected modify count 预期修改次数)的变量
Itr初始化时用expectedModCount记录集合的modCount变量,此后它会检测modCount的值
如果modCount与一开始记录在expectedModeCount中的值不等,说明集合内容被修改过,此时会抛出ConcurrentModificationException。
你这个程序姑且不说还有别的一些细小的问题,就单独拿你说的这个问题,你在用i进行迭代遍历的时候,试图通过al修改List,那么按照上面解释的源代码,expectedModCount没有发生改变,而modCount变了,自然就抛出异常了
然后你改为Iterator对象本身的remove操作,这个操作在删除对象的同时,不但修改了modCount的值,还修改了expectedModCount的值,因此就不会抛出异常
如果你还想知道我说的小问题,我觉得可能是你代码没贴全的缘故
1. 你的这段代码,不论是al,还是i,都抛出并发修改异常,因为你的list的是空的,modCount,expectedModCount 这两个值无论如何都没法改变
2. 不加泛型的集合不是好集合,不安全 |