我是靠谱客的博主 风趣心锁,最近开发中收集的这篇文章主要介绍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,才可以正常循环,不遗漏其中的某个元素。

最后

以上就是风趣心锁为你收集整理的java for循环iterator的区别(reomve)的全部内容,希望文章能够帮你解决java for循环iterator的区别(reomve)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部