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("還剩余的元素個(gè)數(shù):"+list.size());
}
}
上述的代碼按照思路應(yīng)該是對(duì)的,輸出的結(jié)果也應(yīng)該是0
看下面實(shí)際輸出的結(jié)果:
還剩余的元素個(gè)數(shù):2
你也許會(huì)問為什么呢?因?yàn)榧系拇笮∈莿?dòng)態(tài)變化的,當(dāng)你刪除一個(gè)元素之后,元素中的序號(hào)又重新排列,原來(lái)第二個(gè)應(yīng)該刪除的元素現(xiàn)在排在了第一個(gè)元素的位置,真正刪除的卻是第三個(gè)元素,依次類推,刪除的是第一個(gè)、第三個(gè)、第五個(gè)、、、、如果在原來(lái)刪除的代碼中加入語(yǔ)句:System.out.println("即將刪除的元素:"+list.get(i));即可驗(yàn)證。
加入上述語(yǔ)句后輸出的結(jié)果:
即將刪除的元素:a
即將刪除的元素:c
即將刪除的元素:e
還剩余的元素個(gè)數(shù):2
解決辦法:
究其原因是因?yàn)槟阋獎(jiǎng)h除的元素往前面移動(dòng)了,而你的i保存的值依舊往后走,所以如果讓i不往后走,往前走一個(gè),即可刪除本來(lái)排在第二個(gè)位置的元素現(xiàn)在排在了第一個(gè)位置上的元素。
更改后的核心代碼:
for(int i=0;i<list.size();i++){
System.out.println("即將刪除的元素:"+list.get(i));
list.remove(i);
i--;
}
結(jié)果:
即將刪除的元素:a
即將刪除的元素:b
即將刪除的元素:c
即將刪除的元素:d
即將刪除的元素:e
還剩余的元素個(gè)數(shù):0
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
SpringBoot3集成Swagger3的詳細(xì)教程
Swagger 3(OpenAPI 3.0)提供了更加強(qiáng)大和靈活的API文檔生成能力,本教程將指導(dǎo)您如何在Spring Boot 3項(xiàng)目中集成Swagger3,并使用Knife4j作為UI界面,需要的朋友可以參考下2024-03-03
ElasticSearch如何設(shè)置某個(gè)字段不分詞淺析
最近在學(xué)習(xí)ElasticSearch官方文檔過(guò)程中發(fā)現(xiàn)的某個(gè)問題,記錄一下 希望能幫助到后面的朋友,下面這篇文章主要給大家介紹了關(guān)于ElasticSearch如何設(shè)置某個(gè)字段不分詞的相關(guān)資料,需要的朋友可以參考下2022-04-04
Java 字節(jié)數(shù)組類型(byte[])與int類型互轉(zhuǎn)方法
下面小編就為大家?guī)?lái)一篇Java 字節(jié)數(shù)組類型(byte[])與int類型互轉(zhuǎn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
mybatis注解動(dòng)態(tài)sql注入map和list方式(防sql注入攻擊)
這篇文章主要介紹了mybatis注解動(dòng)態(tài)sql注入map和list方式(防sql注入攻擊),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2021-11-11
java中LinkedList使用迭代器優(yōu)化移除批量元素原理
本文主要介紹了java中LinkedList使用迭代器優(yōu)化移除批量元素原理,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
JAXB命名空間_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了JAXB命名空間的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
shuffle的關(guān)鍵階段sort(Map端和Reduce端)源碼分析
今天小編就為大家分享一篇關(guān)于shuffle的關(guān)鍵階段sort(Map端和Reduce端)源碼分析,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
關(guān)于SpringBoot整合Canal數(shù)據(jù)同步的問題
大家都知道canal是阿里巴巴旗下的一款開源工具,純java開發(fā),支持mysql數(shù)據(jù)庫(kù),本文給大家介紹SpringBoot整合Canal數(shù)據(jù)同步的問題,需要的朋友可以參考下2022-03-03

