记录一个 foreach 和迭代器中的list remove放法问题

先看一下正面例子:

这道Java基础题真的有坑!我求求你,认真思考后再回答

然后再看一下反面的例子:

这道Java基础题真的有坑!我求求你,认真思考后再回答

但是我们换一下判断条件

这道Java基础题真的有坑!我求求你,认真思考后再回答

原因如下(自己看源码的理解):ArrayList源码中remove和add方法 有一个modCount字段用来记录集合改变的次数,ArrayList中remove方法调用的时候 会对modCount进行++操作,而使用foreach其实底层也是用的 迭代器,迭代器next方法中用到了一个checkForComodification这个方法,这个方法中时判断modCount 和expectedModCount是否相等,如果不等就会抛出上面的异常,但是 ArrayList remove方法中并没有维护expectedModCount 和modCount的关系,只有在ArrayList中的内部类中的Itr 的remove才把modCount赋值给了expectedModCount

看源码图(ArrayList的remove 方法)

这道Java基础题真的有坑!我求求你,认真思考后再回答

Itr中的remove方法,其中ArrayList.this.remove就是操作了modCount 然后就是把它赋值给了expectedModCount

这道Java基础题真的有坑!我求求你,认真思考后再回答

 

上面说到foreach 底层其实是迭代器,所以循环一次就会调用迭代器的next()方法

这道Java基础题真的有坑!我求求你,认真思考后再回答

 

好了真相就是这样的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章