迭代器的工作原理以及底层原码

本文揭示了Java中增强for循环与迭代器的内在联系,通过实例分析ArrayList和LinkedList的iterator原理,并讨论了Iterator接口的多样实现。重点讲解了ArrayList的迭代器工作机制和如何通过底层源码理解其工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在我们Java语言中,有for循环可以进行遍历,不过也还有其他方式实现这一操作,比如增强for循环以及迭代器,迭代器,又名为遍历器,顾名思义,那么迭代器是怎么工作运行的呢,底层究竟是怎样,迭代器与增强for循环之间有何联系,还有,每个实现类返回的Iterator接口可能会不一样,接下来一一举例说明。

        增强for循环底层是迭代器:

        也可以理解为,用增强for循环形式调动了迭代器的方法,最终也是以迭代器的形式去遍历

         在集合中添加一些元素,用增强for循环遍历集合

接下来,看原码来阐述,将工具调成 “调试”界面,底层分三步看

  第一步,先调用了iterator方法,准备开始遍历

 第二步,再调用了hasNext方法,判断位置是否有元素

 第三步,而后调用了Next方法,有元素去获取它

 

上面说完了增强for循环与迭代器的联系,可能会想,既然增强for的底层是用的迭代器,那么迭代器是怎样运行的呢

       

        第一,创建集合,添加元素,集合对象名去调用iterator方法,此时程序已经准备好了遍历

 

        第二,不确定循环次数则使用while循环,条件判断为,用iterator调用hasNext方法,此时会有游标(指针),初始是指向索引值为0的位置,判断是否有元素,有元素,则告诉Next方法,去获取该位置元素,

        第三,循环内调用next方法,遍历打印集合元素,直到条件判断为false,结束循环

 

 

Iterator接口返回的不同实现类结果都会不一样

下图创建Collection集合,调用iterator方法,编译看左边,运行看右边,也就是说实质调用ArrayList类的iterator方法

 

      进入调试页面, ArrayList类的iterator方法 (底层原码)

 

将ArrayList类换成了LinkedList类,调用iterator方法,编译看左边,运行看右边,这里也就是调用LinkedList类的iterator方法

 进入调试页面,LinkedList类的iterator方法 (底层原码)

 

举了两个例子,也显示两种实现类底层原码,

返回值是Iterator接口,返回的是不同实现类对象,则每个实现的结果也会不同

每个实现类都会有自己Iterator接口里的Next,hasNext等等方法,所以并不能一概而论,迭代器实现原理要具体分类去阐述

就说说平时用的比较多的ArrayList类吧

ArrayList类对迭代器的实现原理:

进入调试页面看原码,如下图,不难看出里面的Itr类是成员内部类 ,也有成员变量 int cursor,初始为0

接下来到了第17行代码,while循环

 

 进入原码,因为调用了hasNext方法,用游标判断下个索引值是否有元素,cursor即为游标,此时看第854行代码,这行很重要cursor!=size,size代表元素个数,而此时cursor为0(前面提过),元素个数有5个,size为5,条件判断则为true

 

 现在来看第18行代码,打印调用Next方法

调试页面看原码,这里858行代码就是Next方法,863行为核心代码,ArrayList集合底层是Object类型的数组,此处用Object类型数组来接收,同名的外部类成员变量(具体是什么值最下面图中有描述)

866行代码:i为0 加1,赋值给cursor,此时cursor为1,因为此时获取到了元素,所以cursor(游标)+1,否则程序结束了,不会+1

回到上面的cursor!=size作比较,去判断下个索引值位置有无元素

 

鼠标光标移到elementDate变量上,会有一些信息,也正是上面集合中的元素

 

ArrayList类对迭代器的实现原理概括:

调用iterator方法,此时准备好了遍历

使用while循环,条件判断为调用hasNext方法,会有cursor(游标)预判下个索引值位置是否有元素,有元素,会告诉Next方法,你有活干了(获取元素)

循环体里调用Next方法,拿到元素~

综上是我对迭代器原理的描述,觉得文章写的不错,可以点赞收藏哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值