参考:
ConcurrentModificationException(并发修改异常)可能原因和解决方法
Java迭代器详解,看这一篇就够了
JAVA iterator迭代器遍历一遍后不能再遍历了吗 迭代器循环list
集合的顶层接口Collection继承Iterable接口,实现迭代器iterator()
迭代器一旦定义,不允许其他地方对其定义的集合元素,进行增加或者删除,比如:
本线程不行,其他线程当然也不行:
具体机制是:
ArrayList底层中定义了一个成员变量modCount,记录集合被修改的次数,集合每调用一次增加或删除元素的函数,modCount加1.当通过调用集合上的 iterator() 函数来创建迭代器时,会把modCount 值传递给迭代器的expectedModcount成员变量,之后每次调用集合上的hasNext()、next()、currentItem() 函数都会检查集合上modCount 和 expectedModcount 是否相等,两个值不相等,说明进行了增删,即抛出运行时异常结束程序。
增加和删除不行,修改可以:
拓展:
增强for循环可以代替Iterator迭代器,可以把它看做简化版的Iterator,和迭代器本质一样,其实它的底层实现就是Iterator迭代器,只能用于遍历集合或数组。
可以使用:CopyOnWriteArrayList
注意:仅限元素为copy了一份,个数依然是原arr的实时的个数