1、Iterator蕊梧,迭代器遍歷適用于連續(xù)內(nèi)存儲(chǔ)存方式压固,如:array數(shù)組,arrayList集合(底層也是基于數(shù)組實(shí)現(xiàn))
缺點(diǎn):從頭開(kāi)始遍歷秃诵,不靈活
有點(diǎn):可對(duì)遍歷的元素進(jìn)行刪除操作
2续搀、foreach遍歷
底層實(shí)現(xiàn)也是基于Iterator,從頭開(kāi)始遍歷菠净,因?yàn)橥獠慷嗔艘粚宇愋娃D(zhuǎn)換禁舷,所以性能幣Iterator慢
3、普通for循環(huán)遍歷
有點(diǎn):遍歷靈活毅往,可指定起始位置牵咙,性能高
缺點(diǎn):需要額外獲取list.size(),產(chǎn)生額外代碼攀唯。遍歷中不允許刪除遍歷的元素洁桌,會(huì)報(bào)ConcurrentModificationException異常
為什么用iterator刪除元素不拋異常,而for循環(huán)刪除會(huì)拋異常呢侯嘀?
這主要是因?yàn)閍rraylist每次遍歷的時(shí)候會(huì)去判斷該集合是否被修改過(guò)另凌,調(diào)用的方法是checkForComodification()。 如果被修改過(guò)ConcurrentModificationException異常戒幔。
如何判斷是否修改呢途茫,主要是通過(guò)維護(hù)2個(gè)變量來(lái)實(shí)現(xiàn),modCount記錄了修改次數(shù)溪食,expectedModCount記錄期望修改次數(shù)囊卜。 通過(guò)iterator.remove()進(jìn)行的刪除操作,會(huì)同時(shí)修改modCount错沃、ConcurrentModificationException; 而通過(guò)list.remove(object/index)栅组,則只會(huì)修改modCount。 這也是fast-fail機(jī)制枢析。