简介
本文介绍Java的List的正确的删除方法。
实例
需求:有如下初始数据,将list中的所有数据为"b"的元素删除掉。即:填充removeB()方法
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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的下标倒序遍历
|
1 2 3 4 5 6 7 8 |
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()
|
1 2 3 4 5 6 |
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迭代器
|
1 2 3 4 5 6 7 8 9 10 |
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)遍历
|
1 2 3 4 5 6 7 8 |
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的下标正序遍历
|
1 2 3 4 5 6 7 8 |
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集合的所有数据删除掉。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
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个元素(错误版) * 执行结果:没有完全删除。打印结果:[b, d] */ /** * 下面遍历操作过程如下: * i = 0 list.size() == 5 执行完第一次list.remove(0); list剩下[b,c,d,e] * i = 1 list.size() == 4 执行完第二次list.remove(1); list剩下[b,d,e] * i = 2 list.size() == 3 执行完第三次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个元素(错误版) * 执行结果:元素没有删除。打印结果:[d, e] */ /** * 下面遍历操作过程如下: * i = 0 list.size() == 5 执行完第一次list.remove(0); list剩下[b,c,d,e] * i = 1 list.size() == 4 执行完第二次list.remove(0); list剩下[c,d,e] * i = 2 list.size() == 3 执行完第三次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个(错误版) * 执行结果:报错。打印结果: * 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个(正确版) * 执行结果:完全删除。打印结果:[] */ /** * 下面遍历操作过程如下: * i = 0 len == 5 执行完第一次list.remove(0); list剩下[b,c,d,e] * i = 1 len == 5 执行完第二次list.remove(0); list剩下[c,d,e] * i = 2 len == 5 执行完第三次list.remove(0); list剩下[d,e] * i = 3 len == 5 执行完第四次list.remove(0); list剩下[e] * i = 4 len == 5 执行完第五次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删除方法的资料请关注其它相关文章!
原文链接:https://blog.csdn.net/feiying0canglang/article/details/124853294
查看更多关于详解Java中List的正确的删除方法的详细内容...