詳解Java中List的正確的刪除方法
簡介
本文介紹Java的List的正確的刪除方法。
實例
需求:有如下初始數(shù)據(jù),將list中的所有數(shù)據(jù)為"b"的元素刪除掉。即:填充removeB()方法
package com.example.a; import java.util.ArrayList; import java.util.List; public class Demo { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("b"); list.add("c"); list.add("d"); removeB(list); } private static void removeB(List<String> list) { // 待填充 } }
正確方法
法1:for的下標倒序遍歷
private static void removeB(List<String> list) { for (int i = list.size() - 1; i >= 0; i--) { if ("b".equals(list.get(i))) { list.remove(i); } } System.out.println(list); }
結果
[a, c, d]
法2: list.stream().filter().collect()
private static void removeB(List<String> list) { List<String> newList = list.stream() .filter(e -> !"b".equals(e)) .collect(Collectors.toList()); System.out.println(newList); }
結果
[a, c, d]
法3: iterator迭代器
private static void removeB(List<String> list) { Iterator<String> it = list.iterator(); while (it.hasNext()) { String s = it.next(); if ("b".equals(s)) { it.remove(); } } System.out.println(list); }
結果
[a, c, d]
錯誤方法
法1:for(xxx : yyy)遍歷
private static void removeB(List<String> list) { for (String s : list) { if ("b".equals(s)) { list.remove(s); } } System.out.println(list); }
結果(報異常)
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at com.example.a.Demo.removeB(Demo.java:18)
at com.example.a.Demo.main(Demo.java:14)
法2:for的下標正序遍歷
private static void removeB(List<String> list) { for (int i = 0; i < list.size(); i++) { if ("b".equals(list.get(i))) { list.remove(list.get(i)); } } System.out.println(list); }
結果(有的沒有刪除掉)
[a, b, c, d]
原因分析
需求:通過遍歷把list集合的所有數(shù)據(jù)刪除掉。
package com.example.a; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; public class Demo { private static List<String> list = new ArrayList<>(); public static void main(String[] args) { reset(); // method1(); // method2(); // method3(); // method4(); } private static void reset(){ list.clear(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("e"); } /** * 方法一:遍歷刪除第i個元素(錯誤版) * 執(zhí)行結果:沒有完全刪除。打印結果:[b, d] */ /** * 下面遍歷操作過程如下: * i = 0 list.size() == 5 執(zhí)行完第一次list.remove(0); list剩下[b,c,d,e] * i = 1 list.size() == 4 執(zhí)行完第二次list.remove(1); list剩下[b,d,e] * i = 2 list.size() == 3 執(zhí)行完第三次list.remove(2); list剩下[b,d] * i = 3 list.size() == 2 i > list.size()所以條件不滿足,最后剩下[b,d] */ public static void method1() { for (int i = 0; i< list.size(); i++) { list.remove(i); } System.out.println(list); } /** * 方法二:刪除第0個元素(錯誤版) * 執(zhí)行結果:元素沒有刪除。打印結果:[d, e] */ /** * 下面遍歷操作過程如下: * i = 0 list.size() == 5 執(zhí)行完第一次list.remove(0); list剩下[b,c,d,e] * i = 1 list.size() == 4 執(zhí)行完第二次list.remove(0); list剩下[c,d,e] * i = 2 list.size() == 3 執(zhí)行完第三次list.remove(0); list剩下[d,e] * i = 3 list.size() == 2 i > list.size()所以條件不滿足,最后剩下[d,e] */ public static void method2() { for (int i = 0; i< list.size(); i++) { list.remove(0); } System.out.println(list); } /** * 方法三:只取一次長度刪除第i個(錯誤版) * 執(zhí)行結果:報錯。打印結果: * Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 2 */ /** * 只求取list.size()長度一次 * i == 0 len == 5 list.remove(0) list剩下[b,c,d,e] * i == 1 len == 5 list.remove(1) list剩下[b, d,e] * i == 2 len == 5 list.remove(2) list剩下[b, d] * i == 3 len == 5 list.remove(3) list因為沒有第四個元素,于是報索引越界錯誤 */ public static void method3() { int len = list.size(); for (int i = 0; i < len; i++) { list.remove(i); } System.out.println(list); } /** * 方法四:只取一次長度刪除第0個(正確版) * 執(zhí)行結果:完全刪除。打印結果:[] */ /** * 下面遍歷操作過程如下: * i = 0 len == 5 執(zhí)行完第一次list.remove(0); list剩下[b,c,d,e] * i = 1 len == 5 執(zhí)行完第二次list.remove(0); list剩下[c,d,e] * i = 2 len == 5 執(zhí)行完第三次list.remove(0); list剩下[d,e] * i = 3 len == 5 執(zhí)行完第四次list.remove(0); list剩下[e] * i = 4 len == 5 執(zhí)行完第五次list.remove(0); list剩下[] */ public static void method4() { int len = list.size(); // 保證只獲取一次長度 for (int i = 0; i< len; i++) { list.remove(0); } System.out.println(list); } }
以上就是詳解Java中List的正確的刪除方法的詳細內容,更多關于Java List刪除方法的資料請關注腳本之家其它相關文章!
相關文章
Mybatisplus自動填充實現(xiàn)方式及代碼示例
這篇文章主要介紹了Mybatisplus自動填充實現(xiàn)方式及代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11