概述
记录一下前一段时间写代码出现的一个问题。我循环一个jsonArray,为空的字段,删除掉,我一开始用的是for循环,发现删除有问题,就去百度了下,说是用迭代器(iterator),今天有空,就看了下,才发现二者的区别的。
List l = new ArrayList();
l.add("");
l.add("aa");
l.add("bb");
for (int i = 0; i < l.size(); i++) {
String data = (String) l.get(i);
if (StringUtils.isEmpty(data)) {
//remove 文档中有这句
//Shifts any subsequent elements to the left
//将任何后续元素移动到左边
l.remove(i);
}
}
System.out.println(l.toString());
}
这样写循环的话,就有问题。因为第一个键值为空,所以删除下标为零的数据。然后整个list前移,数据大概就是这样: [“aa”,“bb”]。for循环处,下标增加1. i=1,然后就直接到bb了,aa就跳过去了。
正确的写法应该使用迭代器(iterator)
List l = new ArrayList();
l.add("");
l.add("aa");
l.add("bb");
Iterator iter = l.iterator();
while(iter.hasNext()){
String str = (String) iter.next();
if(StringUtils.isEmpty(str)){
iter.remove();
}
}
System.out.println(l.toString());
这样就正常遍历了,为什么呢。因为在Iterator的remove方法中,自动把当前下标值cursor属性进行了-1,所以下次遍历,还是从为0的下标开始遍历的,所以就是正常遍历的了。而同样放在上面的例子中。我们显式对下标进行-1操作,其也是可以正常遍历的。
List l = new ArrayList();
l.add("");
l.add("aa");
l.add("bb");
for (int i = 0; i < l.size(); i++) {
String data = (String) l.get(i);
if (StringUtils.isEmpty(data)) {
//remove 文档中有这句
//Shifts any subsequent elements to the left
//将任何后续元素移动到左边
l.remove(i);
i--;
}
}
System.out.println(l.toString());
}
区别在于对于remove的处理操作是有些不同的。Iterator迭代器,是会对下标index进行-1操作,而我们直接for循环ArrayList进行处理,则需要在remove之后,下标index进行显式-1,才可以正常循环,不遗漏其中的某个元素。
最后
以上就是风趣心锁为你收集整理的java for循环iterator的区别(reomve)的全部内容,希望文章能够帮你解决java for循环iterator的区别(reomve)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复