Java?list移除元素相關(guān)操作指南
1.刪除指定元素(四種方法)
(1)增強(qiáng)for(避免java.util.ConcurrentModificationException異常)
//如刪除能夠整除3的元素 ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5,6,7,8,9,10)); //刪除前: System.out.println(list); for (Integer integer : new ArrayList<>(list)) { if (integer % 3 == 0){ list.remove(integer); } } //刪除后: System.out.println(list);
結(jié)果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 4, 5, 7, 8, 10]
注意:上述代碼中刪除元素時,我遍歷時創(chuàng)建了集合對象的副本,對副本進(jìn)行遍歷,對原數(shù)組進(jìn)行了刪除,這是一種方式,沒法直接遍歷list并刪除,那樣會出現(xiàn)以下錯誤:
D:\java\jdk1.8.0_321\bin\java.exe "-javaagent:D:\softlocation\idea 2019\IntelliJ IDEA 2019.3.1\lib\idea_rt.jar=51701:D:\softlocation\idea 2019\IntelliJ IDEA 2019.3.1\bin" -Dfile.encoding=UTF-8 -classpath [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:911) at java.util.ArrayList$Itr.next(ArrayList.java:861) at com.sh.mu.script.logic.system.Likou.LiKouTest.main(LiKouTest.java:49)
java.util.ConcurrentModificationException 是 Java 中的一個運(yùn)行時異常,它發(fā)生在我們試圖在單線程的環(huán)境下修改一個集合對象的同時,另一個線程也在修改同一個集合對象時。
為了避免這個異常,我們有以下幾種解決方案:
1.在單線程環(huán)境下,使用 Iterator 的 remove() 方法刪除元素,而不是直接修改集合對象。
2.在多線程環(huán)境下,使用線程安全的集合類,如 ConcurrentHashMap、CopyOnWriteArrayList 等。
3.在單線程環(huán)境下,創(chuàng)建集合對象的副本,對副本進(jìn)行修改操作。
4.使用 Java 8 的 Lambda 表達(dá)式和流操作,而不是顯式使用迭代器。
(2)迭代器
//如刪除能夠整除3的元素 ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5,6,7,8,9,10)); //刪除前: System.out.println(list); Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()){ Integer next = iterator.next(); if (next % 3 ==0){ iterator.remove(); } } //刪除后: System.out.println(list);
結(jié)果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 4, 5, 7, 8, 10]
(3)stream流
//如刪除能夠整除3的元素 ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5,6,7,8,9,10)); //刪除前: System.out.println(list); List<Integer> integers = list.stream().filter(e -> e % 3 != 0).collect(Collectors.toList()); for (Integer integer : new ArrayList<>(list)) { if (integer % 3 == 0){ list.remove(integer); } } //刪除后: System.out.println(integers);
結(jié)果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 4, 5, 7, 8, 10]
(4)removeIf()
//如刪除能夠整除3的元素 ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5,6,7,8,9,10)); //刪除前: System.out.println(list); list.removeIf(integer -> integer % 3 == 0); //刪除后: System.out.println(list);
結(jié)果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 4, 5, 7, 8, 10]
2.從list2中刪除包含list1的元素
(1)for循環(huán)
注意遍歷和刪除不能操作同一數(shù)據(jù),避免并發(fā)修改帶來的問題。
ArrayList<Integer> list1 = new ArrayList<>(Arrays.asList(1,2,3,6)); ArrayList<Integer> list2 = new ArrayList<>(Arrays.asList(1,2,3,1,2,3,4,5)); //刪除前 System.out.println("list1元素:" + list1); System.out.println("list2刪除前:" + list2); for (Integer integer : new ArrayList<>(list2)) { for (Integer integer1 : new ArrayList<>(list1)) { if (Objects.equals(integer, integer1)){ list2.remove(integer1); } }
結(jié)果:
list1元素:[1, 2, 3, 6]
list2刪除前:[1, 2, 3, 1, 2, 3, 4, 5]
list2刪除后:[4, 5]
(2)removeAll()
ArrayList<Integer> list1 = new ArrayList<>(Arrays.asList(1,2,3,6)); ArrayList<Integer> list2 = new ArrayList<>(Arrays.asList(1,2,3,1,2,3,4,5)); //刪除前 System.out.println("list1元素:" + list1); System.out.println("list2刪除前:" + list2); list2.removeAll(list1); System.out.println("list2刪除后:" + list2);
結(jié)果:
list1元素:[1, 2, 3, 6]
list2刪除前:[1, 2, 3, 1, 2, 3, 4, 5]
list2刪除后:[4, 5]
(3)removeIf()
ArrayList<Integer> list1 = new ArrayList<>(Arrays.asList(1,2,3,6)); ArrayList<Integer> list2 = new ArrayList<>(Arrays.asList(1,2,3,1,2,3,4,5)); //刪除前 System.out.println("list1元素:" + list1); System.out.println("list2刪除前:" + list2); list2.removeAll(list1); list2.removeIf(list1::contains); System.out.println("list2刪除后:" + list2);
結(jié)果:
list1元素:[1, 2, 3, 6]
list2刪除前:[1, 2, 3, 1, 2, 3, 4, 5]
list2刪除后:[4, 5]
(4)stream流
使用Java8及以上版本的Stream API:首先利用stream()獲取流,然后使用filter過濾掉不需要的元素,最后使用collect方法收集結(jié)果。
ArrayList<Integer> list1 = new ArrayList<>(Arrays.asList(1,2,3,6)); ArrayList<Integer> list2 = new ArrayList<>(Arrays.asList(1,2,3,1,2,3,4,5)); //刪除前 System.out.println("list1元素:" + list1); System.out.println("list2刪除前:" + list2); List<Integer> collect = list2.stream().filter(e -> !list1.contains(e)).collect(Collectors.toList()); System.out.println("list2刪除后:" + collect);
結(jié)果:
list1元素:[1, 2, 3, 6]
list2刪除前:[1, 2, 3, 1, 2, 3, 4, 5]
list2刪除后:[4, 5]
3.刪除指定下標(biāo)元素
(1)remove(index)方法
這是List接口提供的一個方法,可以直接刪除指定下標(biāo)位置的元素,使用此方法,需要傳要刪除的元素下標(biāo)。
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,1,2,3,4,5)); System.out.println("list刪除前:" + list); //刪除list下標(biāo)為1的元素 list.remove(1); System.out.println("list刪除后:" + list);
結(jié)果:
list刪除前:[1, 2, 3, 1, 2, 3, 4, 5]
list刪除后:[1, 3, 1, 2, 3, 4, 5]
(2)subList(int fromIndex,int toIndex)方法
如:刪除下表1到3的元素:該方法返回源列表的一個子列表,包含從fromIndex(包含)到toIndex(不包含)之間的所有元素。如果fromIndex和toIndex相同,則返回一個空的子列表。
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,1,2,3,4,5)); System.out.println("list刪除前:" + list); //刪除下標(biāo)為1到3的元素 list.subList(1,3).clear(); System.out.println("list刪除后:" + list);
結(jié)果:
list刪除前:[1, 2, 3, 1, 2, 3, 4, 5]
list刪除后:[1, 1, 2, 3, 4, 5]
總結(jié)
到此這篇關(guān)于Java list移除元素相關(guān)操作指南的文章就介紹到這了,更多相關(guān)Java list移除元素內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java并發(fā)編程StampedLock高性能讀寫鎖詳解
這篇文章主要為大家介紹了java并發(fā)編程StampedLock高性能讀寫鎖的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Java使用BigDecimal精確運(yùn)算浮點(diǎn)數(shù)
這篇文章主要介紹了Java使用BigDecimal精確運(yùn)算浮點(diǎn)數(shù),幫助大家更好的處理浮點(diǎn)數(shù)數(shù)據(jù),感興趣的朋友可以了解下2020-10-10Java?DelayQueue實(shí)現(xiàn)延時任務(wù)的示例詳解
DelayQueue是一個無界的BlockingQueue的實(shí)現(xiàn)類,用于放置實(shí)現(xiàn)了Delayed接口的對象,其中的對象只能在其到期時才能從隊列中取走。本文就來利用DelayQueue實(shí)現(xiàn)延時任務(wù),感興趣的可以了解一下2022-08-08手寫redis@Cacheable注解?參數(shù)java對象作為key值詳解
這篇文章主要介紹了手寫redis@Cacheable注解?參數(shù)java對象作為key值詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01使用Spring的ApplicationEvent實(shí)現(xiàn)本地事件驅(qū)動的實(shí)現(xiàn)方法
本文介紹了如何使用Spring的ApplicationEvent實(shí)現(xiàn)本地事件驅(qū)動,通過自定義事件和監(jiān)聽器,實(shí)現(xiàn)模塊之間的松耦合,提升代碼的可維護(hù)性和擴(kuò)展性。同時還介紹了異步事件和事件傳遞的相關(guān)知識2023-04-04interrupt()和線程終止方式_動力節(jié)點(diǎn)Java學(xué)院整理
線程的thread.interrupt()方法是中斷線程,將會設(shè)置該線程的中斷狀態(tài)位,即設(shè)置為true,中斷的結(jié)果線程是死亡、還是等待新的任務(wù)或是繼續(xù)運(yùn)行至下一步,就取決于這個程序本身2017-05-05Java+Swing實(shí)現(xiàn)醫(yī)院管理系統(tǒng)的完整代碼
這篇文章主要介紹了Java+Swing實(shí)現(xiàn)醫(yī)院管理系統(tǒng)的完整代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05java equals和=,==的區(qū)別詳細(xì)介紹
這篇文章主要介紹了java equals和=,==的區(qū)別,學(xué)習(xí)Java的朋友對equals 和== 這個概念開始使用的時候會有疑問,很難辨別如何正確使用,這里幫大家詳細(xì)講解該知識點(diǎn),希望大家能掌握,有需要的小伙伴可以參考下2016-10-10