Iterator
不同的List实现迭代器也不同
FailFast :一旦发现遍历的同时,其他人修改,则抛异常
比如ArrayList在增强for的时候(增强for底层是迭代器)
迭代器创建时,会获取list集合修改的次数 存入expectedModCount
然后==调用hasNext()==判断有没有下一个元素
然后==调用next()==移动到下一个元素
next方法中会调用checkForComodification()方法,该方法会对expectedModCount进行检查
将存入的expectedModCount 和 list集合修改次数进行比较,不同则抛异常 ConcurrentModificationException(并发修改异常)
FailSafe :发现遍历的同时,其他人修改,使用应对策略,如 牺牲一致性让整个遍历完成
如CopyOnWriterArrayList
但是本次遍历,修改不会显示。在下次遍历的时候才能体现出来修改的内容。
增强for的时候创建迭代器(增强for底层是迭代器)
但是这个迭代器为COWIterator
迭代器会记录下老数组的内容,如果我们给集合添加一个元素。
这个添加后的元素不会记录到迭代器中,而是记录在List中。
所以迭代器里面的数组还是 刚开始的数组,这样就造成了迭代器中的是老数组,List中是新数组。
这样就能解释为什么 本次遍历,修改不会显示了