JAVA集合的遍历

在遍历数组时,我们可以使用增强for循环进行遍历,同样,遍历集合也可以使用增强for循环,而在collection接口中,还存在一个用于遍历集合的方法Iterator,被称为迭代器,使用这两种方式,都可以对集合进行遍历。
首先我们使用增强for循环对一个集合进行遍历:

@Test
    public void test1(){
        ArrayList a1=new ArrayList();
        a1.add("aa");
        a1.add("bb");
        a1.add("cc");
        a1.add("dd");
        a1.add("ee");
        for (Object obj : a1) {
            System.out.println(obj);
        }
    }

运行结果:
在这里插入图片描述
接下来主要说一说使用迭代器Iterator遍历集合:
查看源码,不难发现,Iterator本身是一个接口,其中包含了几个遍历时常用的方法。

boolean hasNext():返回值为布尔,用于判断当前集合中下一个元素是否存在

E next():返回值为自定义类型,用于得到当前集合中的下一个元素

接下来使用迭代器进行集合遍历:

首先声明一个集合:

		HashSet set=new HashSet();
        set.add("aa");
        set.add("bb");
        set.add("cc");

接下来进行第一步操作,获取该集合的迭代器:

Iterator iterator=set.iterator();

接下来通过next()方法获取下一个元素:

Object object=iterator.hasNext();

而由于我们要进行遍历取值,则需要循环获取下一个元素,而循环条件则是集合中下一个元素存在,首先我们可以试一下第next()方法进行非空判断:

	while (iterator.next()!=null){
            System.out.println(iterator.next());
        }

运行结果:
在这里插入图片描述
发现只打印了一个元素并且报了元素不存在错误。说明该方法是有错误的。
原因是迭代器中存在一个类似于指针的东西,比如上面的集合中存在3个元素,但迭代器的初始指针指向的并不是第一个元素的位置,比如这张图:
在这里插入图片描述
指针最初指向的是元素1前面的位置,当我们调用next()方法时,指针便会向后移动一个位置,按照上面的代码,第一次判断下一个元素为1,不为空,则输出2,第二次判断1的下一个元素为2,不为空,输出3,而现在第三次判断2的下一个元素是3,打印的却是3后面一位,不存在元素,于是就出现了该错误。

而正确的做法是调用hashNext()方法即可:

while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

运行结果:
在这里插入图片描述

接下来说一下Iterator接口的子接口ListIterator,通过名字不难看出,该接口和List集合应该存在某种关系,ListIterator名为列表迭代器,是List体系集合特有的迭代器,较Iteraor,它有什么不同呢?

首先先看一个例子,假设我们有一个List集合如下:

List list=new ArrayList();
        list.add("aa");
        list.add("bb");
        list.add("cc");
        list.add("dd");
        list.add("ee");

此时有一个需求是,要在bb的位置插入一个字符串“bbbb”,先使用Iterator完成该操作:

 Iterator iterator=list.listIterator();
        while (iterator.hasNext()){
            Object object=iterator.next();
            if (object.equals("bb")){
                list.add("bbbb");
            }
        }

运行后发现报错:
在这里插入图片描述
该异常意为并发修改异常,分析原因,在while循环中,迭代器一边在遍历集合,而另一边集合本身却又在添加元素,两个不同的操作对象在同时进行,无法保证速度,于是发生了错误。而如果迭代器既有遍历的功能,又有添加元素的功能,两个功能都交给迭代器完成,该错误就能避免了。查看ListIterator的方法,发现其拥有add方法,于是我们用该接口进行操作:

ListIterator iterator=list.listIterator();
        while (iterator.hasNext()){
            Object object=iterator.next();
            if (object.equals("bb")){
                iterator.add("bbbb");
            }
        }

        for (Object object:
             list) {
            System.out.println(object);
        }

运行结果:
在这里插入图片描述
在ListIterator中还提供了许多其他的方法,甚至可以调用set()方法,在迭代操作时对指定的元素进行修改,但该接口只能对List集合使用。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值