增强for循环之删除
疑問:為什么刪除倒數第二個不報錯
通過反編譯文件發現增強for循環底層實現是迭代器
源碼追蹤
cursor:迭代器游標,初始值為0,每迭代一次就會+1;
lastRet:最后一個元素的索引值,若不存在返回-1;
expectedModCount:預期修改次數,在初始化時就已經被賦為modCount
① 調用hasNext(),判斷是否還有下一個元素,通過判斷游標和list長度來判斷,如果不一致,則代表還有下一個元素。
② 調用next(),此時會走checkForComodification(),去校驗實際修改次數和預期修改次數是否一致,如果不一致,則拋出異常,觸發fail-fast機制;(fail-fast 機制是java集合中的一種錯誤機制,快速失敗)
cursor->0 cursor->1
next->a next->b remove->modCount->5,size->3
cursor->2
next->checkForComodification,modCount(5) != exceptedModCount(4),fail-fast
cursor->0 cursor->1 cursor->2
next->a next->b next->c remove->modeCount->5,size->3
cursor->3
next->hasNext(),cursor(3) == size(3) break;
總結:
hasNext()判斷cursor和size是否一致,一致就break,刪除到倒數第二個的時候剛好一致,所以不會接著走next(),next()會判斷modCount和expectedModCount是否一致,不一致就fail-fast,所以如果不是刪除倒數第二個出現特殊的cursor=size的話,刪除其他就會fail-fast
如何解決fail-fast:調用迭代器內部的remove,而不是AarrayList的remove;
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的增强for循环之删除的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 获取请求地址
- 下一篇: mybatis批量更新报错XXXXX-I