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