浅析List.remove在for循环中会出现的问题及解决方案

一、问题背景

1、问题:

  在for循环中对list对象进行remove或add操作,会导致数组长度变更,以致业务逻辑出错。

2、原因:

  我们在删除某个元素后,list的大小发生了变化,这时候你的的索引也会发生变化,这时就会导致你在遍历的时候漏掉某些元素。

  比如当你删除第1个元素后,我们如果还是继续根据索引访问第2个元素时,因为删除的关系,后面的元素都往前移动了一位,所以实际访问的是第3个元素。这样就漏掉了第2个元素,当第3个元素删除后,元素再向前移动一位,你再访问index=3的元素时,实际访问的是第5个元素,这样就漏掉了第4位元素。

  所以这种方式可以用在删除特定的一个元素时使用,但不适合循环删除多个元素时使用。

二、解决方案

  主要有3种解决方案:

1、倒过来遍历list:倒序遍历,不存在漏掉的

IDataset list=new DatasetList();
for(int i=list.size()-1;i>=0;i--){
    list.remove(i);
}

2、每移除一个元素以后再把i移回来

IDataset list=new DatasetList();
for(int i=0;i<list.size();i++){
    list.remove(i);
    i=i-1;
}

3、使用 iterator.remove() 方法删除

  for循环,Iterator是迭代器,迭代循环一个du集合,Iterator i=code.iterator()调用code的迭代器,i.hasNext()表示迭代器中能否找到集合的下一个值,如果能找到这个值,则执行{String str = ite.next();},把这个值赋给变量str。如果找不到这个值,就跳出循环。

for (Iterator<String> ite = list.iterator(); ite.hasNext();) {
      String str = ite.next();
      System.out.println(str);
      if (str.contains("b")) {
          ite.remove();
      }
}

 

posted @ 2017-08-12 22:52  古兰精  阅读(828)  评论(0编辑  收藏  举报