我是靠谱客的博主 仁爱帆布鞋,这篇文章主要介绍使用List中的remove方法遇到的坑,不信你没有踩过!,现在分享给大家,希望可以做个参考。

作者: Alice_qixin

blog.csdn.net/Alice_qixin/article/details/80256882

精彩推荐

一百期Java面试题汇总

SpringBoot内容聚合

IntelliJ IDEA内容聚合

Mybatis内容聚合

先来看一下下面的样例是否符合你的问题场景

list中根据判断条件符合的就remove掉一个数据

复制代码
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
 public static void main(String[] args) {         List<CaseHead> list=new ArrayList<CaseHead>();         CaseHead caseHead1=new CaseHead();         caseHead1.setCaseid("a");         CaseHead caseHead2=new CaseHead();         caseHead2.setCaseid("b");         CaseHead caseHead3=new CaseHead();         caseHead3.setCaseid("c");         CaseHead caseHead4=new CaseHead();         caseHead4.setCaseid("d");         CaseHead caseHead5=new CaseHead();         caseHead5.setCaseid("e");         list.add(caseHead1);         list.add(caseHead2);         list.add(caseHead3);         list.add(caseHead4);         list.add(caseHead5);         List<String> list2=new ArrayList<String>();         list2.add("a");         list2.add("b");         for (int i = 0; i < list.size(); i++) {             String caseid=list.get(i).getCaseid();             for (int j = 0; j <list2.size() ; j++) {                 String l=list2.get(j);                 if (caseid.equals(l)){                     list.remove(i);                 }             }         }         for (int a = 0; a < list.size(); a++) {             System.out.println(list.get(a).getCaseid());         }}

结果是什么?

结果是一下。根据以上代码,希望得到的结果是 cde 但是运行结果是bcde那么问题来了为什么会得到一下结果呢

先看一下list remove的源码

复制代码
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
// 删除ArrayList指定位置的元素     public E remove(int index) {         RangeCheck(index);//检查index是否超出list大小范围,否则抛出异常         modCount++;         E oldValue = (E) elementData[index];//elementData是实现list的数组         int numMoved = size - index - 1;//当执行删除操作是后面的元素全部向前面移动一位         if (numMoved > 0)             System.arraycopy(elementData, index+1, elementData, index,                  numMoved);         elementData[--size] = null;         return oldValue;     }     // 删除ArrayList的指定元素     public boolean remove(Object o) {         if (o == null) {           for (int index = 0; index < size; index++)              if (elementData[index] == null) {                  fastRemove(index);                 return true;             }         } else {             for (int index = 0; index < size; index++)               if (o.equals(elementData[index])) {                   fastRemove(index);                   return true;               }         }         return false;    }   //快速删除第index个元素   private void fastRemove(int index) {         modCount++;           int numMoved = size - index - 1;           if (numMoved > 0)               System.arraycopy(elementData, index+1, elementData, index,                                numMoved);           elementData[--size] = null;     } 

源码可知,List在删除指定位置的对象时,执行删除操作是后面的元素全部向前面移动一位

因为,当你remove掉一个对象时,list的就少了一个 index 0的被remove了,之前index 1的数据就自动变为index 0了。arrayList是有顺序数组,从0开始。如果从前开始删除实际上就相当于跳着删除了。

解决办法1:

每次删除之后i--自动返回到上一个index开始

复制代码
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
    public static void main(String[] args) {         List<CaseHead> list=new ArrayList<CaseHead>();         CaseHead caseHead1=new CaseHead();         caseHead1.setCaseid("a");         CaseHead caseHead2=new CaseHead();         caseHead2.setCaseid("b");         CaseHead caseHead3=new CaseHead();         caseHead3.setCaseid("c");         CaseHead caseHead4=new CaseHead();         caseHead4.setCaseid("d");         CaseHead caseHead5=new CaseHead();         caseHead5.setCaseid("e");         list.add(caseHead1);         list.add(caseHead2);         list.add(caseHead3);         list.add(caseHead4);         list.add(caseHead5);         List<String> list2=new ArrayList<String>();         list2.add("a");         list2.add("b");         for (int i = 0; i < list.size(); i++) {             String caseid=list.get(i).getCaseid();             for (int j = 0; j <list2.size() ; j++) {                 String l=list2.get(j);                 if (caseid.equals(l)){                     list.remove(i);                     i--;                 }             }         }         for (int a = 0; a < list.size(); a++) {             System.out.println(list.get(a).getCaseid());         } }

第二种解决方法

倒着删除从后往前遍历删除,从index大的往index小的删

复制代码
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
    public static void main(String[] args) {         List<CaseHead> list=new ArrayList<CaseHead>();         CaseHead caseHead1=new CaseHead();         caseHead1.setCaseid("a");         CaseHead caseHead2=new CaseHead();         caseHead2.setCaseid("b");         CaseHead caseHead3=new CaseHead();         caseHead3.setCaseid("c");         CaseHead caseHead4=new CaseHead();         caseHead4.setCaseid("d");         CaseHead caseHead5=new CaseHead();         caseHead5.setCaseid("e");         list.add(caseHead1);         list.add(caseHead2);         list.add(caseHead3);         list.add(caseHead4);         list.add(caseHead5);         List<String> list2=new ArrayList<String>();         list2.add("a");         list2.add("b");         for (int i = list.size()-1; i >= 0; i--) {             String caseid=list.get(i).getCaseid();             for (int j = 0; j <list2.size() ; j++) {                 String l=list2.get(j);                 if (caseid.equals(l)){                     list.remove(i);                 }             }         }         for (int a = 0; a < list.size(); a++) {             System.out.println(list.get(a).getCaseid());         } }

此问题,本人仅在remove对象时发现到此错误。当list里面是基本类型数据时并没有发生以上问题。在此记好。仅供参考

END

复制代码
1
2
我知道你 “在看”

最后

以上就是仁爱帆布鞋最近收集整理的关于使用List中的remove方法遇到的坑,不信你没有踩过!的全部内容,更多相关使用List中内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部