java遍歷途中修改數(shù)據(jù)及刪除數(shù)據(jù)的方法總結(jié)
前言
在Java中,如果你需要一邊遍歷一邊修改數(shù)據(jù)或刪除數(shù)據(jù),有幾種常見(jiàn)的方法可以實(shí)現(xiàn)。關(guān)鍵點(diǎn)是要避免在遍歷時(shí)直接修改或刪除集合中的元素,因?yàn)檫@可能導(dǎo)致ConcurrentModificationException異常。以下是一些安全的方式:
1、Iterator遍歷
使用Iterator遍歷并修改/刪除元素: 使用Iterator是安全的一種方式,因?yàn)樗峁┝吮闅v過(guò)程中進(jìn)行修改和刪除操作的方法,而且不會(huì)導(dǎo)致ConcurrentModificationException異常。
List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); Iterator<Integer> iterator = numbers.iterator(); while (iterator.hasNext()) { Integer number = iterator.next(); // 修改數(shù)據(jù) // 對(duì)于修改操作,你可以通過(guò)直接修改iterator返回的元素來(lái)修改原集合中的數(shù)據(jù) iterator.set(number * 2); // 刪除數(shù)據(jù) if (number % 2 == 0) { iterator.remove(); } } System.out.println(numbers); // 輸出: [2, 6, 10]
2、ListIterator遍歷
使用ListIterator遍歷并修改/刪除元素: ListIterator是Iterator的子類(lèi),除了支持向前和向后遍歷外,還支持在遍歷時(shí)添加、修改和刪除元素。
List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); ListIterator<Integer> listIterator = numbers.listIterator(); while (listIterator.hasNext()) { Integer number = listIterator.next(); // 修改數(shù)據(jù) listIterator.set(number * 2); // 刪除數(shù)據(jù) if (number % 2 == 0) { listIterator.remove(); } } System.out.println(numbers); // 輸出: [2, 6, 10]
3、臨時(shí)列表
使用一個(gè)臨時(shí)列表進(jìn)行修改或刪除: 遍歷集合時(shí),可以使用一個(gè)臨時(shí)的列表來(lái)保存需要修改或刪除的元素,遍歷完成后再進(jìn)行實(shí)際的修改和刪除操作。
List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); List<Integer> elementsToRemove = new ArrayList<>(); for (Integer number : numbers) { // 修改數(shù)據(jù) // 假設(shè)我們要將所有的奇數(shù)變成原來(lái)的兩倍 if (number % 2 != 0) { int newNumber = number * 2; elementsToRemove.add(number); numbers.add(newNumber); } // 刪除數(shù)據(jù) if (number % 3 == 0) { elementsToRemove.add(number); } } numbers.removeAll(elementsToRemove); System.out.println(numbers); // 輸出: [2, 4, 8, 10]
請(qǐng)注意,上述方法中的第三種可能會(huì)在較大的數(shù)據(jù)集上導(dǎo)致性能問(wèn)題,因?yàn)樗婕皬?fù)制和刪除元素,所以最好在數(shù)據(jù)集較小時(shí)使用。如果可能,推薦使用第一種或第二種方法,它們?cè)诒闅v時(shí)直接修改或刪除元素,并且更高效。
總結(jié)
到此這篇關(guān)于java遍歷途中修改數(shù)據(jù)及刪除數(shù)據(jù)的文章就介紹到這了,更多相關(guān)java遍歷修改及刪除數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring的@CrossOrigin注解處理請(qǐng)求源碼解析
這篇文章主要介紹了Spring的@CrossOrigin注解處理請(qǐng)求源碼解析,@CrossOrigin源碼解析主要分為兩個(gè)階段@CrossOrigin注釋的方法掃描注冊(cè),請(qǐng)求匹配@CrossOrigin注釋的方法,本文從源碼角度進(jìn)行解析,需要的朋友可以參考下2023-12-12Java開(kāi)發(fā)人員最常犯的5個(gè)錯(cuò)誤總結(jié)
作為一名java開(kāi)發(fā)程序員,不知道大家有沒(méi)有遇到過(guò)一些匪夷所思的bug。這些錯(cuò)誤通常需要您幾個(gè)小時(shí)才能解決。今天,小編總結(jié)一些常見(jiàn)的編碼錯(cuò)誤,然后給出解決方案。希望大家在日常編碼中能夠避免這樣的問(wèn)題2022-12-12基于令牌桶的限流器注解的簡(jiǎn)單實(shí)現(xiàn)詳解
令牌桶算法是一種常用的流量控制算法,用于限制請(qǐng)求或事件的發(fā)生速率,這篇文章主要介紹了如何基于令牌桶實(shí)現(xiàn)限流器注解,需要的可以參考一下2023-08-08java實(shí)現(xiàn)日歷應(yīng)用程序設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)日歷應(yīng)用程序設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06MyBatis一次執(zhí)行多條SQL語(yǔ)句的操作
這篇文章主要介紹了MyBatis一次執(zhí)行多條SQL語(yǔ)句的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12springmvc中下載中文文件名稱(chēng)為下劃線的解決方案
這篇文章主要介紹了springmvc中下載中文文件名稱(chēng)為下劃線的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01ElasticSearch如何設(shè)置某個(gè)字段不分詞淺析
最近在學(xué)習(xí)ElasticSearch官方文檔過(guò)程中發(fā)現(xiàn)的某個(gè)問(wèn)題,記錄一下 希望能幫助到后面的朋友,下面這篇文章主要給大家介紹了關(guān)于ElasticSearch如何設(shè)置某個(gè)字段不分詞的相關(guān)資料,需要的朋友可以參考下2022-04-04