異常產(chǎn)生
當(dāng)我們迭代一個(gè)ArrayList或者HashMap或者set時(shí)唆涝,如果嘗試對(duì)集合做一些修改操作(例如刪除元素(大多數(shù)為刪除)新增),可能會(huì)拋出java.util.ConcurrentModificationException的異常跋炕。
以上這段簡(jiǎn)單的代碼,在很多人看來(lái)不應(yīng)該有問(wèn)題中贝,為什么會(huì)出異常呢道宅,也許很多人想不通,下面我來(lái)具體解釋下:
異常原因
ArrayList的父類(lèi)AbstarctList中有一個(gè)域modCount籍救,每次對(duì)集合進(jìn)行修改(增添元素习绢,刪除元素……)時(shí)都會(huì)modCount++
而foreach的背后實(shí)現(xiàn)原理其實(shí)就是Iterator(關(guān)于Iterator可以看Java Design Pattern: Iterator),等同于注釋部分代碼蝙昙。在這里闪萄,迭代ArrayList的Iterator中有一個(gè)變量expectedModCount,該變量會(huì)初始化和modCount相等耸黑,但如果接下來(lái)如果集合進(jìn)行修改modCount改變桃煎,就會(huì)造成expectedModCount!=modCount,此時(shí)就會(huì)拋出java.util.ConcurrentModificationException異常
過(guò)程如下圖:
分析jdk源碼得知如下:
異常是這個(gè)方法拋出的大刊,在獲取元素的時(shí)候为迈,默認(rèn)會(huì)去檢查modCount和expectModCount 是否相等不等拋出異常
解決辦法:
使用iterator 進(jìn)行遍歷,以及相關(guān)刪除缺菌,增加操作