list中for迴圈刪除多個元素為何報錯?
乾貨點:最近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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- list增強for迴圈刪除元素報錯
- Java碼農必須掌握的迴圈刪除List元素的正確方法Java
- for迴圈無法刪除陣列所有指定元素陣列
- 在ArrayList的迴圈中刪除元素,會不會出現問題?
- python迴圈刪除漏洞Python
- 阿里巴巴為什麼這樣強制從List中刪除元素阿里
- J2SE-刪除List集合元素
- 反直覺正迴圈刪除
- JavaScript 拼接多個陣列並刪除重複元素JavaScript陣列
- 【廖雪峰python入門筆記】list刪除元素_pop()Python筆記
- mySql刪除多個表 刪除多個欄位的SQLMySql
- jQuery為元素新增和刪除classjQuery
- 建立元素和刪除元素
- STL.vector容器刪除單個元素、部分元素、全部元素
- jQuery刪除元素jQuery
- jQuery 刪除元素jQuery
- 【Java】增強for迴圈,三種迭代的能否刪除Java
- HashMap 之元素刪除HashMap
- 使用 Python 迴圈建立多個列表Python
- 刪除大量檔案Argument list too long錯誤解決
- 為什麼for迴圈可以遍歷list:Python中迭代器與生成器Python
- C++ forward_list 中插入和刪除操作C++Forward
- PHP從陣列中刪除元素的方法PHP陣列
- Python 中刪除列表元素的三種方法Python
- PHP 如何根據鍵值刪除一個陣列中的元素PHP陣列
- JavaScript刪除陣列元素JavaScript陣列
- JS刪除陣列裡的某個元素方法JS陣列
- 單向迴圈連結串列——查詢、刪除、插入結點
- 增強for為什麼不能刪除集合裡的元素
- ES6刪除字串中重複的元素字串
- List 按照指定大小分割為多個list的幾種方式,list分片
- JavaScript 刪除陣列指定元素JavaScript陣列
- JavaScript刪除array陣列元素JavaScript陣列
- laravel 多對多關聯刪除中間表Laravel
- Lambda 表示式遍歷集合時用remove方法刪除list集合中滿足條件的元素問題REM
- 除錯js碰到迴圈斷點(debugger),應該怎麼做?除錯JS斷點
- 何為Java 中的多型?Java多型
- vscode 除錯多個js檔案VSCode除錯JS