好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

详解Java中List的正确的删除方法

简介

本文介绍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的正确的删除方法的详细内容...

  阅读:29次