list中for迴圈刪除多個元素為何報錯?

gamebus發表於2021-09-09

乾貨點:最近review同事程式碼的時候發現了一個問題,在ArrayList中邊遍歷邊刪除多個元素,在提醒同事後就想著寫篇文章從原始碼角度詳細聊聊這個問題好了,當然了我也發現很多人其實都不知道這個報錯的原理是什麼,如果你也不知道,那確實該好好看這篇文章了。

前幾天review同事程式碼的時候發現對方提交了一份list中邊遍歷邊刪除的程式碼,大概是這樣的:

圖片描述

初學者咋一看其實沒毛病,可是執行結果會是這樣的:

圖片描述

哦豁,這是為啥?大家都知道,本飯遇見問題喜歡刨根問底,於是我就在報錯的地方斷個點,可以看到,在第一次遍歷的時候

圖片描述

兩個值都是6相等,因此不會丟擲ConcurrentModificationException異常。而等到i==2被移除後

圖片描述

可以看到兩個值並不一樣,因此丟擲出ConcurrentModificationException異常終止程式。

本著刨根問底的心態,自然下一步要解決的就是這兩個值是什麼時候被設定進來以及為什麼會不一樣呢?

本飯反斷點了回去看到在加到第6個值的時候

圖片描述

可以看到此時的modCount為6,到了這一步就解決了ArrayList.this.modCount的設定問題了,
接下來看下上文提到的this.expectedModCount問題,我斷點for迴圈後深入除錯可以看到

圖片描述

此處在取得遍歷器的時候就已經將ArrayList.this.modCount賦值到expectedModCount中,到了這一步就很明顯了,在進行remove(i)的時候改變了ArrayList.this.modCount的值,導致兩個值不相同,後面還有元素再進行遍歷的時候check了一下,發現不對等,所以才翻了車,哦,不對,才報的錯。

嗯,終於描述完這個過程了,那麼我們再看看,這樣子會有問題嗎

圖片描述

不會的,哈哈哈,因為在你remove掉資料後,便直接return掉了,不會再進行後續的check,那麼自然也就沒有問題了。

那麼難道就沒有方法可以一邊遍歷一邊進行多次刪除了嗎,不是的,詳情等我下篇文章,敬請期待!!!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4687/viewspace-2825239/,如需轉載,請註明出處,否則將追究法律責任。

相關文章