深入理解java集合框架(java.util.ConcurrentModificationException)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 【傳智播客.黑馬程序員訓(xùn)練營(yíng)成都中心】 轉(zhuǎn)載請(qǐng)注明出處 作者:成都校區(qū).堂堂老師 1. 什么時(shí)候會(huì)產(chǎn)生并發(fā)修改異常...
    OpenCoder閱讀 1,545評(píng)論 0 3
  • 接著Java集合框架學(xué)習(xí)---深入探究ArrayList源碼(二)繼續(xù)學(xué)習(xí)ArrayList源碼。 removeA...
    EakonZhao閱讀 1,070評(píng)論 0 6
  • ArrayList 源碼分析 不知道各位朋友,還記得開(kāi)工前制定的學(xué)習(xí)目標(biāo)么? 有沒(méi)有一直為了那個(gè)目標(biāo)廢寢忘食呢?繼...
    醒著的碼者閱讀 1,529評(píng)論 6 11
  • 傳送門 解讀阿里Java開(kāi)發(fā)手冊(cè)(v1.1.1) - 異常日志 前言 阿里Java開(kāi)發(fā)手冊(cè)談不上圣經(jīng),但確實(shí)是大量...
    kelgon閱讀 4,461評(píng)論 4 50
  • 都說(shuō)女孩子要內(nèi)心強(qiáng)大,才能過(guò)好一生。 可是我不愿意不停的告誡自己要強(qiáng)大要強(qiáng)大。 我也脆弱,也孤獨(dú),甚至有自私有懦弱...
    ashley晶閱讀 286評(píng)論 0 0

友情鏈接更多精彩內(nèi)容