java for循环iterator的区别(reomve)

记录一下前一段时间写代码出现的一个问题。我循环一个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,才可以正常循环,不遗漏其中的某个元素。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值