记一次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));
输出结果: