记一次java list remove的坑

在业务中会有这样的场景,批量新增,新增前校验数据库中是否已存在相同的数据,如果有则将数据从集合中移除。很多人会选择遍历,然后remove(i),这样就错了,就像下面这段代码.

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("10");
list.add("4");
list.add("5");
list.add("6");
for(int i=0;i<list.size();i++){
    if(Integer.valueOf(list.get(i))%2==0){
           list.remove(i);
    }
}

list.stream().forEach(s->System.out.println(s));

这段代码期望输出的结果是:1,5

但结果并非如此,结果是1,10,5

10应该被过滤掉,可是并没有,为什么呢?是这样的,i=1时集合中2符合条件,被移除,此时集合中的对象元素都会向前移一位,元素10此时对应的集合索引为1,而此时的i+1=2,那么10就不会被遍历到,自然也不会被过滤掉。

问题找到了,怎么解决呢?我们可以新new一个集合,将要过滤的元素放到新new的集合中,然后使用list.removeAll(),如下代码;

 List<String> list = new ArrayList<>();
        List<String> nlist = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("10");
        list.add("4");
        list.add("5");
        list.add("6");
        for(int i=0;i<list.size();i++){
            if(Integer.valueOf(list.get(i))%2==0){
                //list.remove(i);
                nlist.add(list.get(i));
            }
        }
        list.removeAll(nlist);
        list.stream().forEach(s->System.out.println(s));

输出结果:

 

posted @ 2020-09-02 22:07  vijayxu  阅读(383)  评论(0编辑  收藏  举报