記錄一個 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基礎題真的有坑!我求求你,認真思考後再回答

 

好了真相就是這樣的

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