使用Iterator刪除List中的多個(gè)元素操作
今天在寫(xiě)代碼時(shí)要?jiǎng)h除List中的多個(gè)元素時(shí)犯了一個(gè)很搞笑的錯(cuò)誤,等效的就是以下代碼
public static void main(String[] args) {
List<String> a = new ArrayList<String>();
a.add("1");
a.add("2");
a.add("3");
a.add("4");
a.add("5");
Iterator<String> iterator = a.iterator();
while(iterator.hasNext()){
if("1".equals(iterator.next()) || "2".equals(iterator.next()))
iterator.remove();
}
}
運(yùn)行后發(fā)現(xiàn)只能刪除“1”這個(gè)元素,“2”刪除不掉,后來(lái)才發(fā)現(xiàn)判斷的時(shí)候如果第一個(gè)條件不滿足,iterator.next()這個(gè)方法又會(huì)執(zhí)行一遍,相當(dāng)于已經(jīng)不再是當(dāng)前的元素了,當(dāng)時(shí)寫(xiě)的還特別順溜。。。
應(yīng)該改成下面 這樣
while(iterator.hasNext()){
String str = iterator.next();
if("1".equals(str) || "2".equals(str))
iterator.remove();
}
把當(dāng)前指向的元素單獨(dú)提出來(lái)放在條件判斷里面,平時(shí)在寫(xiě)普通循環(huán)的時(shí)候?qū)懥?xí)慣了,沒(méi)有把循環(huán)中的元素提出來(lái)。
記錄一下
補(bǔ)充知識(shí):Iterator遍歷集合時(shí)不可以刪除集合中的元素問(wèn)題
博客用于記錄編程是遇到的問(wèn)題,便于以后隨時(shí)復(fù)習(xí)。
Iterator是工作在一個(gè)獨(dú)立的線程中,擁有一個(gè)mutex鎖。Iterator被創(chuàng)建后會(huì)建立一個(gè)指向原來(lái)對(duì)象的單鏈索引表,當(dāng)原來(lái)的對(duì)象數(shù)量發(fā)生變化時(shí),這個(gè)索引表的內(nèi)容不會(huì)同步改變,所以當(dāng)索引指針向后面移動(dòng)的時(shí)候就找不到要迭代的對(duì)象,按照f(shuō)ail-fast原則,Iterator會(huì)馬上拋出 java.util.ConcurrentModificationException異常。
所以,在Iterator工作時(shí),不允許迭代對(duì)象被改變。但可以使用Iterator本身的方法iterator.remove()來(lái)刪除對(duì)象,該方法會(huì)在刪除當(dāng)前迭代對(duì)象的同時(shí)維護(hù)索引的一致性。舉例:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class TestIterator {
public void iteratorDelete(List<Integer>list){
Iterator<Integer> it=list.iterator();
while(it.hasNext()){
Integer integer=it.next();
if (integer<20) {
//可以刪除
it.remove();
//運(yùn)行時(shí)異常
// list.remove(integer);
}
}
System.out.println(list.toString());
}
public static void main(String[] args) {
List<Integer>list=new ArrayList<>();
list.add(18);
list.add(20);
list.add(30);
list.add(40);
TestIterator testIterator=new TestIterator();
testIterator.iteratorDelete(list);
}
}
以上這篇使用Iterator刪除List中的多個(gè)元素操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
spring-boot項(xiàng)目啟動(dòng)遲緩異常排查解決記錄
這篇文章主要為大家介紹了spring-boot項(xiàng)目啟動(dòng)遲緩異常排查解決記錄,突然在本地啟動(dòng)不起來(lái)了,表象特征就是在本地IDEA上運(yùn)行時(shí),進(jìn)程卡住也不退出,應(yīng)用啟動(dòng)時(shí)加載相關(guān)組件的日志也不輸出2022-02-02
feign調(diào)用中文參數(shù)被encode編譯的問(wèn)題
這篇文章主要介紹了feign調(diào)用中文參數(shù)被encode編譯的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
解決springboot報(bào)錯(cuò)Failed?to?parse?multipart?servlet?request
在使用SpringBoot開(kāi)發(fā)時(shí),通過(guò)Postman發(fā)送POST請(qǐng)求,可能會(huì)遇到因臨時(shí)目錄不存在而導(dǎo)致的MultipartException異常,這通常是因?yàn)镺S系統(tǒng)(如CentOS)定期刪除/tmp目錄下的臨時(shí)文件,解決方案包括重啟項(xiàng)目2024-10-10
Java編寫(xiě)程序之輸入一個(gè)數(shù)字實(shí)現(xiàn)該數(shù)字階乘的計(jì)算
這篇文章主要介紹了Java編寫(xiě)程序之輸入一個(gè)數(shù)字實(shí)現(xiàn)該數(shù)字階乘的計(jì)算,本文通過(guò)實(shí)例代碼給大家介紹的非常想詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
解析MyBatis源碼實(shí)現(xiàn)自定義持久層框架
這篇文章主要介紹了手撕MyBatis源碼實(shí)現(xiàn)自定義持久層框架,涉及到的設(shè)計(jì)模式有Builder構(gòu)建者模式、??模式、代理模式,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
java隨機(jī)抽取指定范圍內(nèi)不重復(fù)的n個(gè)數(shù)
這篇文章主要為大家詳細(xì)介紹了java隨機(jī)抽取指定范圍內(nèi)不重復(fù)的n個(gè)數(shù),感興趣的小伙伴們可以參考一下2016-02-02

