異常產(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的父類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)刪除,增加操作