数据结构(Java):聚焦迭代器遍历的背后——底层源码解析

1、引言

我们知道,对于List系列集合,添加的元素是有序、可重复、有索引的;而对于Set系列集合,添加的元素是无序、不重复、无索引的。

那么使用for循环通过下标来对Set系列集合进行遍历,那显然是不行的。

迭代器就可以解决这个问题。

因为迭代器不依赖索引,故既能对有索引集合进行遍历,又能对无索引集合进行遍历。

迭代器也是集合专用的遍历方式。

2、迭代器遍历

迭代器遍历的原理就是:从下标0的位置开始,一个元素一个元素的向后遍历,直到遍历结束。

注意:迭代器不依赖索引

代码如下:

public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();

        list.add("aaa");
        list.add("bbb");
        list.add("ccc");

        //获取迭代器对象
        Iterator<String> it = list.iterator();

        while (it.hasNext()) {//判断当前位置是否有元素
            String str = it.next();//1.获取当前位置 2.将迭代器指针指向下一个元素
            System.out.println(str);
        }
    }

我先对其中的方法做一下简单说明。

2.1 获取迭代器对象

使用迭代器进行遍历,我们首先需要获取迭代器对象,而我们可以调用ArrayList中的iterator方法来获取迭代器对象。

我们通过源码可以发现,返回值为Iterator<E>,我们使用Iterator<E>接收即可。

2.2 迭代器的方法

2.2.1 hasNext方法

该方法就是判断,当前迭代器对象指向的位置上是否有元素,若有元素,则返回true,若没有元素,则返回false。

2.2.2 next方法

该方法有两个步骤:

1.获取当前位置上的元素

2.迭代器指针往后移动,指向下一个元素


到目前为止,想要使用迭代器来进行遍历,以上的三种方法是我们必须要掌握的:

1.iterator方法:获取迭代器对象

2.hasNext方法:判断当前位置是否有元素

3.Next方法:获取当前位置元素并且迭代器指针向后移动


2.3 迭代器的四个细节

2.3.1 细节点1

如果当前位置没有元素,还使用next方法进行获取,会抛出NoSuchElementException异常

2.3.2 细节点2

迭代器遍历完毕,指针不会复位

2.3.3 细节点3

循环中只能用一次next方法

因为每使用一次next方法,指针就会向后移动一次;若循环中有两个next方法,而元素个数为奇数个时,则会一次循环指针移动两次,最后一次循环时,会有一个next获取元素时当前位置没有元素,会抛出NoSuchElementException异常。

2.3.4 细节点4

迭代器遍历时,不能使用集合的方法进行增加或删除元素

例如:

若在迭代器遍历时使用了集合的增加或者删除方法,会抛出ConcurrentModificationException(并发修改异常)

至于为什么不能使用集合的方法来修改元素,我将在下面的源码分析中解释。

所以,如果想要在迭代器遍历时修改元素,我们使用迭代器的相关方法即可:

代码:

public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();

        list.add("aaa");
        list.add("bbb");
        list.add("ccc");

        Iterator<String> iterator = list.iterator();

        while (iterator.hasNext()) {
            String str = iterator.next();
             if ("aaa".equals(str)) {
                 //迭代器遍历时,删除元素,只能使用迭代器的remove方法
                 iterator.remove();
             }
        }

        System.out.println(list);
    }

如果要删除元素,使用迭代器的remove方法;

如果要添加元素,暂时还没有方法。


到这里,迭代器遍历的基础内容已讲解完毕,接下来是迭代器底层源码的解析


2.4 迭代器遍历 源码深度解析

我已经将底层源码分析整理在这张图上,清晰明了:

OK~本次博客到这里就结束了,

感谢大家的阅读~欢迎大家在评论区交流问题~

如果博客出现错误可以提在评论区~

创作不易,请大家多多支持~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值