Lmxy1990 ' Blog

java中的集合删除方法注意点

集合类的删除方法


  • 最近做的业务遇到一个排名的需求.在remove的时候,数据出来的意志有问题.逻辑检查好几遍都没问题.debug之后,才找出这个问题.看示例代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    List<Integer> pp = new ArrayList<>() ;
    pp.add(1) ;
    pp.add(2) ;
    pp.add(3) ;
    pp.add(4) ;

    for (int i = 0; i < pp.size(); i++) {
    Integer integer = pp.get(i);
    System.out.println("当前遍历i:" + i + "对应集合数据:" + integer);
    if (integer.equals(3)){
    pp.remove(i) ;
    }
    }

输出:

1
2
3
4
5
当前遍历i:0对应集合数据:1
当前遍历i:1对应集合数据:2
当前遍历i:2对应集合数据:3

Process finished with exit code 0

why?数据4去了哪里?
这其实是remove之后,size会立即变化.但是遍历的指针却并没有做出相应的变化.依旧是自增了一下.也就是说,当i = 2的时候,remove方法执行.然后对应的size变化为3.这时候i++变为了3<3不成立,不再循环,跳出循环.但实际上,并没有循环完成.因为还有一个数据没循环到.也就是i=2现在是新的数据了. 如何避免?="" 我是这样处理的.=""

1
2
3
4
5
6
7
8
9
10
11
12
13
14
List<Integer> pp = new ArrayList<>() ;
pp.add(1) ;
pp.add(2) ;
pp.add(3) ;
pp.add(4) ;

for (int i = 0; i < pp.size(); i++) {
Integer integer = pp.get(i);
System.out.println("当前遍历i:" + i + "对应集合数据:" + integer);
if (integer.equals(3)){
pp.remove(i);
i--;
}
}

输出结果:

1
2
3
4
5
6
当前遍历i:0对应集合数据:1
当前遍历i:1对应集合数据:2
当前遍历i:2对应集合数据:3
当前遍历i:2对应集合数据:4

Process finished with exit code 0


End

坚持原创技术分享,您的支持将鼓励我继续创作!