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集合元素
- ArrayList-Linked-Set的迴圈中刪除資料的錯誤顯示
- JavaScript 拼接多個陣列並刪除重複元素JavaScript陣列
- mybatis list作為引數 foreach迴圈MyBatis
- 刪除陣列中一個或者多個連續的元素陣列
- mySql刪除多個表 刪除多個欄位的SQLMySql
- spring明明沒有迴圈引用的,為什麼總報這個錯?Spring
- jQuery為元素新增和刪除classjQuery
- [破除迷信]java.util.ArrayList在foreach迴圈遍歷時可以刪除元素Java
- hbase中list命令報錯
- 【廖雪峰python入門筆記】list刪除元素_pop()Python筆記
- js連線多個陣列並刪除重複的元素JS陣列
- STL.vector容器刪除單個元素、部分元素、全部元素
- 建立元素和刪除元素
- 【Java】增強for迴圈,三種迭代的能否刪除Java
- jQuery刪除元素jQuery
- jQuery 刪除元素jQuery
- JavaScript刪除陣列第一個元素JavaScript陣列
- 如何刪除ArrayList中的重複元素
- 為什麼for迴圈可以遍歷list:Python中迭代器與生成器Python
- 使用 Python 迴圈建立多個列表Python
- HashMap 之元素刪除HashMap
- removeChild()刪除li元素REM
- C++ forward_list 中插入和刪除操作C++Forward
- 何為Java 中的多型?Java多型
- JavaScript刪除陣列最後一個元素JavaScript陣列
- JavaScript 刪除陣列最後一個元素JavaScript陣列
- 刪除大量檔案Argument list too long錯誤解決
- js刪除陣列中重複的元素JS陣列
- js刪除陣列中的重複元素JS陣列
- js刪除陣列元素中的指定值JS陣列
- PHP從陣列中刪除元素的方法PHP陣列