五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

被問到List 如何一邊遍歷一邊刪除,該怎么回?教你 3 種方法

2021-03-04 18:35 作者:C語言編程__Plus  | 我要投稿

這是最近面試時被問到的1道面試題,本篇文章對此問題進行總結(jié)分享。


文章來源于微信公眾號丨程序員吳師兄

1. 新手常犯的錯誤

可能很多新手(包括當年的我,哈哈)第一時間想到的寫法是下面這樣的:

然后滿懷信心的去運行,結(jié)果竟然拋java.util.ConcurrentModificationException異常了,翻譯成中文就是:并發(fā)修改異常。


是不是很懵,心想這是為什么呢?

讓我們首先看下上面這段代碼生成的字節(jié)碼,如下所示:


由此可以看出,foreach循環(huán)在實際執(zhí)行時,其實使用的是Iterator,使用的核心方法是hasnext()和next()。

然后再來看下ArrayList類的Iterator是如何實現(xiàn)的呢?


可以看出,調(diào)用next()方法獲取下一個元素時,第一行代碼就是調(diào)用了checkForComodification();,而該方法的核心邏輯就是比較modCount和expectedModCount這2個變量的值。

在上面的例子中,剛開始modCount和expectedModCount的值都為3,所以第1次獲取元素"博客園"是沒問題的,但是當執(zhí)行完下面這行代碼時:

platformList.remove(platform);

modCount的值就被修改成了4。


所以在第2次獲取元素時,modCount和expectedModCount的值就不相等了,所以拋出了java.util.ConcurrentModificationException異常。


既然不能使用foreach來實現(xiàn),那么我們該如何實現(xiàn)呢?

主要有以下3種方法:

使用Iterator的remove()方法

使用for循環(huán)正序遍歷

使用for循環(huán)倒序遍歷

接下來一一講解。

2. 使用Iterator的remove()方法

使用Iterator的remove()方法的實現(xiàn)方式如下所示:

輸出結(jié)果為:

[CSDN,掘金]

為什么使用iterator.remove();就可以呢?讓我們看下它的源碼:


可以看出,每次刪除一個元素,都會將modCount的值重新賦值給expectedModCount,這樣2個變量就相等了,不會觸發(fā)java.util.ConcurrentModificationException異常。更多面試題,歡迎關注公眾號 Java面試題精選

3. 使用for循環(huán)正序遍歷

使用for循環(huán)正序遍歷的實現(xiàn)方式如下所示:

這種實現(xiàn)方式比較好理解,就是通過數(shù)組的下標來刪除,不過有個注意事項就是刪除元素后,要修正下下標的值:

i=i-1;

為什么要修正下標的值呢?因為剛開始元素的下標是這樣的:


第1次循環(huán)將元素"博客園"刪除后,元素的下標變成了下面這樣:


第2次循環(huán)時i的值為1,也就是取到了元素”掘金“,這樣就導致元素"CSDN"被跳過檢查了,所以刪除完元素后,我們要修正下下標,這也是上面代碼中i = i – 1;的用途。更多面試問題可以關注微信訂閱號碼匠筆記回復面試獲取

4. 使用for循環(huán)倒序遍歷

使用for循環(huán)倒序遍歷的實現(xiàn)方式如下所示:

這種實現(xiàn)方式和使用for循環(huán)正序遍歷類似,不過不用再修正下標,因為剛開始元素的下標是這樣的:


第1次循環(huán)將元素"掘金"刪除后,元素的下標變成了下面這樣:


第2次循環(huán)時i的值為1,也就是取到了元素”CSDN“,不會導致跳過元素,所以不需要修正下標。

好了,這篇文章就到這里,感謝大家的閱讀,喜歡的話給個三連吧~

作為一名編程學習者,如果你想更好的提升你的編程能力,好好學習C/C++編程知識以及數(shù)據(jù)結(jié)構(gòu),以后努力成為高薪算法/軟件開發(fā)工程師的話!

UP在主頁上傳了一些學習C/C++編程的視頻教程,有興趣或者正在學習的小伙伴一定要去看一看哦!會對你有幫助的~

分享(源碼、項目實戰(zhàn)視頻、項目筆記,基礎入門教程)

歡迎轉(zhuǎn)行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!

編程學習書籍:


編程學習視頻:



被問到List 如何一邊遍歷一邊刪除,該怎么回?教你 3 種方法的評論 (共 條)

分享到微博請遵守國家法律
辽宁省| 隆化县| 太保市| 莒南县| 应用必备| 沧州市| 出国| 个旧市| 光泽县| 莱阳市| 烟台市| 登封市| 东阳市| 仁布县| 祁连县| 黔江区| 仙游县| 开封县| 达孜县| 岑溪市| 延寿县| 南通市| 政和县| 东城区| 九江县| 克什克腾旗| 志丹县| 通渭县| 东港市| 贵阳市| 古丈县| 建宁县| 张家界市| 贵德县| 栖霞市| 昌黎县| 临汾市| 肃南| 周宁县| 田东县| 济南市|