解決JAVA遍歷List集合,刪除數(shù)據(jù)時(shí)出現(xiàn)的問(wèn)題
一、問(wèn)題描述
有時(shí)候,我們會(huì)遇到在遍歷List集合的過(guò)程中刪除數(shù)據(jù)的情況。
看著自己寫(xiě)的代碼,感覺(jué)完全沒(méi)有問(wèn)題,但就是達(dá)不到預(yù)期的效果,這是為什么呢?下面我們來(lái)分析下
String str1 = new String("1"); String str2 = new String("2"); String str3 = new String("3"); String str4 = new String("4"); String str5 = new String("5"); List list = new ArrayList(); list.add(str1); list.add(str2); list.add(str3); list.add(str4); list.add(str5); System.out.println("list.size()=" + list.size()); for (int i = 0; i < list.size(); i++) { list.remove(i); // i--; //System.out.println(i+" "+list.get(i)+" "); } System.out.println("after remove:list.size()=" + list.size());
本來(lái)預(yù)期結(jié)果應(yīng)該是:
list.size()=5
after remove:list.size()=0
但實(shí)際上結(jié)果卻是:
list.size()=5
after remove:list.size()=2
原因如下: List每remove掉一個(gè)元素以后,后面的元素都會(huì)向前移動(dòng) ,此時(shí)如果執(zhí)行i++,則剛剛移過(guò)來(lái)的元素沒(méi)有被讀取。
分析:
- List中有5條數(shù)據(jù),需要循環(huán)5次,
- 第一次數(shù)據(jù)為:1 2 3 4 5
- 執(zhí)行完remove(0) 后,數(shù)據(jù)為 2 3 4 5 , i=1
- 第二次數(shù)據(jù)為:2 3 4 5
- 執(zhí)行完remove(1) 后,數(shù)據(jù)為 2 4 5 , i=2
- 第三次數(shù)據(jù)為:2 4 5
- 執(zhí)行完remove(2) 后,數(shù)據(jù)為 2 4 , i=3
- 此時(shí)如果加上上面注釋的代碼 System.out.println(i+" "+list.get(i)+" "); 循環(huán)第4、5次時(shí)就會(huì)出現(xiàn)異常
二、解決方法
解決方法1:每移過(guò)一次后,再把 i 移回來(lái)
for (int i = 0; i < list.size(); i++) { list.remove(i); i--; }
解決方法2:先刪除后面的元素
for (int i = list.size()-1; i >= 0; i--) { list.remove(i); }
解決方法3:使用iterator刪除
for(Iterator it = list.iterator();it.hasNext();){ it.remove(); }
以上就是解決JAVA遍歷List集合時(shí),刪除數(shù)據(jù)出現(xiàn)的問(wèn)題的詳細(xì)內(nèi)容,更多關(guān)于JAVA遍歷List集合 刪除數(shù)據(jù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
簡(jiǎn)單實(shí)現(xiàn)Spring的IOC原理詳解
這篇文章主要介紹了簡(jiǎn)單實(shí)現(xiàn)Spring的IOC原理詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12基于Java設(shè)計(jì)一個(gè)短鏈接生成系統(tǒng)
相信大家在生活中會(huì)收到很多短信,而這些短信都有一個(gè)特點(diǎn)是鏈接很短。這些鏈接背后的原理是什么呢?怎么實(shí)現(xiàn)的?小編今天就帶你們?cè)敿?xì)了解一下2021-12-12配置了jdk的環(huán)境idea卻提示找不到j(luò)dk解決辦法
在使用Java編程語(yǔ)言進(jìn)行開(kāi)發(fā)時(shí),IDEA是一個(gè)非常流行和強(qiáng)大的集成開(kāi)發(fā)環(huán)境,這篇文章主要給大家介紹了關(guān)于配置了jdk的環(huán)境idea卻提示找不到j(luò)dk的解決辦法,需要的朋友可以參考下2023-12-12Java連接mysql數(shù)據(jù)庫(kù)以及mysql驅(qū)動(dòng)jar包下載和使用方法
這篇文章主要給大家介紹了關(guān)于Java連接mysql數(shù)據(jù)庫(kù)以及mysql驅(qū)動(dòng)jar包下載和使用方法,MySQL是一款常用的關(guān)系型數(shù)據(jù)庫(kù),它的JDBC驅(qū)動(dòng)程序使得我們可以通過(guò)Java程序連接MySQL數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)操作,需要的朋友可以參考下2023-11-11淺析JAVA中的內(nèi)存結(jié)構(gòu)、重載、this與繼承
這篇文章主要介紹了 JAVA中的內(nèi)存結(jié)構(gòu)、重載、this與繼承的相關(guān)資料,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Java消息摘要算法MAC實(shí)現(xiàn)與應(yīng)用完整示例
這篇文章主要介紹了Java消息摘要算法MAC實(shí)現(xiàn)與應(yīng)用,結(jié)合完整實(shí)例形式分析了java消息摘要算法MAC的概念、原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-09-09Java Spring MVC 上傳下載文件配置及controller方法詳解
這篇文章主要介紹了Java Spring MVC 上傳下載文件配置及controller方法詳解,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09一文詳解Java中的可變對(duì)象(Mutable)與不可變對(duì)象(Immutable)
如何在 Java 中創(chuàng)建不可變對(duì)象?我以前以為所有對(duì)象都是不可變的,因?yàn)槿绻愀淖円粋€(gè) String 實(shí)例的內(nèi)容,它總是會(huì)創(chuàng)建一個(gè)新的 String 對(duì)象并指向該對(duì)象,在本文中,我不僅將分享在 Java 中Immutable的步驟,還將討論可變對(duì)象與不可變對(duì)象及其優(yōu)缺點(diǎn)2023-11-11