浅析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();
}
}