List的remove(对象)操作有时候会报ConcurrentModificationException异常
執(zhí)行后,會(huì)拋出ConcurrentModificationException,字面意思是并發(fā)修改異常。異常跟蹤信息如下:
?
Exception inthread "main" java.util.ConcurrentModificationException
???????? atjava.util.AbstractList$Itr.checkForComodification(AbstractList.java:449)
???????? at java.util.AbstractList$Itr.next(AbstractList.java:420)
???????? at ListTest.main(ListTest.java:13)
? ? ? ?可以大概看出是執(zhí)行到AbstractList中內(nèi)部類Itr的checkForComodification方法拋出的異常,至于為什么出現(xiàn)異常,這里可以大概解釋一下。集合遍歷是使用Iterator, Iterator是工作在一個(gè)獨(dú)立的線程中,并且擁有一個(gè)互斥鎖。Iterator 被創(chuàng)建之后會(huì)建立一個(gè)指向原來(lái)對(duì)象的單鏈索引表,當(dāng)原來(lái)的對(duì)象數(shù)量發(fā)生變化時(shí),這個(gè)索引表的內(nèi)容不會(huì)同步改變,所以當(dāng)索引指針往后移動(dòng)的時(shí)候就找不到要迭代的對(duì)象,所以按照 fail-fast原則 Iterator 會(huì)馬上拋出java.util.ConcurrentModificationException 異常。所以 Iterator 在工作的時(shí)候是不允許被迭代的對(duì)象被改變的。
? ? ? ?而要解決這個(gè)問(wèn)題,可以使用Iterator的remove方法,該方法會(huì)刪除當(dāng)前迭代對(duì)象的同時(shí),維護(hù)索引的一致性。如:
? 輸出正確結(jié)果:[1, 2, 6]。
?
? ?不使用迭代器的解決方案就是,自己維護(hù)索引,刪除一個(gè)元素后,索引-1,如:
輸出正確結(jié)果:[1, 2, 6]。
?
?
? ? ? ?還有種取巧的方式是從最后一個(gè)元素開始遍歷,符合條件的刪除,如:
輸出正確結(jié)果:[1, 2, 6]。
?
? ? ? ?最后,Java集合類框架真是大大方便了開發(fā),不用自己去維護(hù)數(shù)組,隨時(shí)擔(dān)心著越界等問(wèn)題。當(dāng)然List的實(shí)現(xiàn)類對(duì)插入、刪除的效率不太一樣,這取決于其實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu),是選擇刪除,還是選擇新建個(gè)集合,這里就不做討論了。
轉(zhuǎn)載于:https://www.cnblogs.com/snowalwaysboy/p/7850425.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的List的remove(对象)操作有时候会报ConcurrentModificationException异常的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: clone()与image和 clone
- 下一篇: [poj] 2749 building