先看一下正面例子:
然後再看一下反面的例子:
但是我們換一下判斷條件
原因如下(自己看源碼的理解):ArrayList源碼中remove和add方法 有一個modCount字段用來記錄集合改變的次數,ArrayList中remove方法調用的時候 會對modCount進行++操作,而使用foreach其實底層也是用的 迭代器,迭代器next方法中用到了一個checkForComodification這個方法,這個方法中時判斷modCount 和expectedModCount是否相等,如果不等就會拋出上面的異常,但是 ArrayList remove方法中並沒有維護expectedModCount 和modCount的關係,只有在ArrayList中的內部類中的Itr 的remove才把modCount賦值給了expectedModCount
看源碼圖(ArrayList的remove 方法)
Itr中的remove方法,其中ArrayList.this.remove就是操作了modCount 然後就是把它賦值給了expectedModCount
上面說到foreach 底層其實是迭代器,所以循環一次就會調用迭代器的next()方法
好了真相就是這樣的