干貨點:最近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,那么自然也就沒有問題了。
那么難道就沒有方法可以一邊遍歷一邊進行多次刪除了嗎,不是的,詳情等我下篇文章,敬請期待!!!