java中for循環(huán)刪除集合陷阱
首先看下面的代碼:
import java.util.LinkedList; import java.util.List; public class DeleteCollection { public static void main(String[] args) { List<String> list = new LinkedList<String>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("e"); for(int i=0;i<list.size();i++){ //循環(huán)刪除集合中的元素 list.remove(i); } System.out.println("還剩余的元素個數(shù):"+list.size()); } }
上述的代碼按照思路應(yīng)該是對的,輸出的結(jié)果也應(yīng)該是0
看下面實(shí)際輸出的結(jié)果:
還剩余的元素個數(shù):2
你也許會問為什么呢?因?yàn)榧系拇笮∈莿討B(tài)變化的,當(dāng)你刪除一個元素之后,元素中的序號又重新排列,原來第二個應(yīng)該刪除的元素現(xiàn)在排在了第一個元素的位置,真正刪除的卻是第三個元素,依次類推,刪除的是第一個、第三個、第五個、、、、如果在原來刪除的代碼中加入語句:System.out.println("即將刪除的元素:"+list.get(i));即可驗(yàn)證。
加入上述語句后輸出的結(jié)果:
即將刪除的元素:a
即將刪除的元素:c
即將刪除的元素:e
還剩余的元素個數(shù):2
解決辦法:
究其原因是因?yàn)槟阋獎h除的元素往前面移動了,而你的i保存的值依舊往后走,所以如果讓i不往后走,往前走一個,即可刪除本來排在第二個位置的元素現(xiàn)在排在了第一個位置上的元素。
更改后的核心代碼:
for(int i=0;i<list.size();i++){ System.out.println("即將刪除的元素:"+list.get(i)); list.remove(i); i--; }
結(jié)果:
即將刪除的元素:a
即將刪除的元素:b
即將刪除的元素:c
即將刪除的元素:d
即將刪除的元素:e
還剩余的元素個數(shù):0
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
相關(guān)文章
java學(xué)習(xí)之JVM運(yùn)行時(shí)常量池理解
這篇文章主要介紹了java學(xué)習(xí)之JVM運(yùn)行時(shí)常量池理解,對常量池的好處以及基本類型的包裝類常量池等作了簡要分析,有需要的朋友可以借鑒參考下2021-09-09springboot整合mybatis-plus逆向工程的實(shí)現(xiàn)
這篇文章主要介紹了springboot整合mybatis-plus逆向工程的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08SpringCloud Zuul在何種情況下使用Hystrix及問題小結(jié)
這篇文章主要介紹了SpringCloud Zuul在何種情況下使用Hystrix 及問題小結(jié),感興趣的朋友跟隨小編一起看看吧2018-11-11springboot+jsonp解決前端跨域問題小結(jié)
這篇文章主要介紹了springboot+jsonp解決前端跨域問題小結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06