Kotlin遍歷集合導(dǎo)致并發(fā)修改異常的原因和解決方法
各位android 老司機(jī)們,對于android 遍歷結(jié)合的時(shí)候,發(fā)生并發(fā)修改異常一定毫不陌生;
之前看到過一篇文章,
在阿里巴巴Java開發(fā)手冊中,有這樣一條規(guī)定:
其實(shí),增強(qiáng)for循環(huán)也是Java給我們提供的一個(gè)語法糖,如果將以上代碼編譯后的class文件進(jìn)行反編譯(使用jad工具)的話,可以得到以下代碼:
1、原因:(其實(shí)我都不想在各位老司機(jī)面前再贅述這個(gè)了。-_-||)
這個(gè)異常產(chǎn)生的原因是,迭代器依賴于集合而存在,在判斷成功后,集合中添加了新的元素,而迭代器并不知道,所有就報(bào)錯了。其實(shí)這個(gè)問題說的是:迭代器遍歷集合中的元素的時(shí)候,不要使用集合對象去修改集合中的元素。
翻看ArrayList源碼和iterator()方法的具體實(shí)現(xiàn),可以發(fā)現(xiàn)ArrayList繼承于集合抽象類有一個(gè)成員變量modCount,在每次對元素進(jìn)行增刪改時(shí),相應(yīng)方法會將modCount++。而進(jìn)行遍歷iterator的next方法中首先會調(diào)用checkForComodification()方法,這個(gè)方法會對modCount和expectedModCount進(jìn)行比較,expectedModCount是iterator的成員變量,一開始被賦值為modCount,兩者不等就會拋出并發(fā)修改的異常。
解決方案:迭代器遍歷的時(shí)候,可以通過迭代器修改集合中的元素,iterator類中也有修改元素的方法,并在修改完成后重新將modCount賦值給expectedModCount,之后進(jìn)行next遍歷檢查就不會再報(bào)異常。
2、解決方法:
1、直接使用普通for循環(huán)進(jìn)行操作
用for 循環(huán)遍歷,然后直接用list 操作,eg:
2、foreach,或者Iterator 遍歷的,直接用Iterator 來操作
3、問題復(fù)現(xiàn)
那么說了這多,其實(shí)就是mapIndexed 這個(gè)方法,這個(gè)語法糖其實(shí)是基于Iterator來遍歷的。
所以,如果你要是在使用這個(gè)方式遍歷的過程中從集合中remove元素,那就會有并發(fā)修改異常產(chǎn)生 ;
我還是貪圖Kotlin 高級用法的甜頭,而忽視了細(xì)節(jié),導(dǎo)致問題出現(xiàn),粗心大意,理解不深害死人。。
總結(jié)
到此這篇關(guān)于Kotlin遍歷集合導(dǎo)致并發(fā)修改異常的原因和解決方法的文章就介紹到這了,更多相關(guān)Kotlin遍歷集合并發(fā)異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android 模仿iPhone列表數(shù)據(jù)View刷新動畫詳解
本文主要介紹Android 模仿iPhone列表數(shù)據(jù)view 刷新動畫的資料,這里整理詳細(xì)的資料,并附示例代碼及實(shí)現(xiàn)效果圖,有興趣的小伙伴可以參考下2016-09-09Android開發(fā)中記一個(gè)SwipeMenuListView側(cè)滑刪除錯亂的Bug
這篇文章主要介紹了Android開發(fā)中記一個(gè)SwipeMenuListView側(cè)滑刪除錯亂的Bug的相關(guān)資料,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09Android進(jìn)程間大數(shù)據(jù)通信LocalSocket詳解
這篇文章主要為大家介紹了Android進(jìn)程間大數(shù)據(jù)通信LocalSocket詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Android實(shí)現(xiàn)zip文件壓縮及解壓縮的方法
這篇文章主要介紹了Android實(shí)現(xiàn)zip文件壓縮及解壓縮的方法,涉及Android針對文件的遍歷及zip壓縮與解壓縮的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07Android仿微信和QQ多圖合并框架(類似群頭像)的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Android仿微信和QQ多圖合并框架的相關(guān)資料,其實(shí)就是我們平時(shí)所見的群聊頭像,文中通過示例代碼介紹的非常詳細(xì),對各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12Android Studio中導(dǎo)入module的方法(簡單版)
這篇文章主要介紹了AndroidStudio中導(dǎo)入module的方法,本文是一篇簡易版的教程,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下2018-01-01Android開發(fā)實(shí)現(xiàn)模仿360二維碼掃描功能實(shí)例詳解
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)模仿360二維碼掃描功能,結(jié)合實(shí)例形式詳細(xì)分析了Android開發(fā)二維碼掃描功能所涉及的zxing開源項(xiàng)目文件使用方法及具體掃碼功能相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-10-10