[迭代器]Java中迭代器中hasNext()及next()的解析

对迭代器的分析

ListIterator是一个接口,使用时通过实例化对象来使用。所有实现了Collection接口的类的对象均可使用

迭代器的使用方法:

 迭代器的运行原理

我们以上图的代码为例,通过调试来发现迭代器的运行逻辑

请大家注意“lastReturned”、“next”、“item”、“nextIndex”。我们接着看第二次循环并对比以上几个数据

请注意:it 存放的地址、last Returned存放的地址、next 存放的地址 都是在变化的。由此我们可以建立一个链表模型

对比调试结果与链表模型:此时刚进入循环,lastReturned=null,它的next指向“486”这个地址。这个地址中放的是第一个元素“hello” 

 ============================分割线===============================

两个指针开始移动,同时nextIndex的值也开始变化 。同时将lastReturned的值打印出来

 

  ============================分割线===============================

 

 

 

 ============================分割线===============================

 于是我们就可以推测出迭代器的工作原理:使用两个指针在链表中进行移动,并打印出第一个指针所指的内容。

那么这两个指针是什么移动的以及什么时候判断指针指向为空呢?这就与hasNext和next有关了

对hasNext()的分析 

这是迭代器中hasNext()的原码——当“nextIndex < size 为真时,返回true” 

而根据前面的调试截图可见:每次循环后nextIndex都要加1;size是链表的长度。两者比较可知循环次数是否超出了链表长度——也就是链表中是否还有元素

于是我们得出了hasNext()的用途:判断链表中是否还有未处理的元素

正是这一特性,我们经常用hasNext()来判断是否要进入新一轮的循环

对next()的分析

我们前面的链表模型就是根据红框中的代码推测出来的:

        “将next(第二根指针)的地址给lastReturned(第一根指针);把第二根指针(next)的下一位链表的地址(next.next)给到第二根指针所指位置——这两步完成后,两根指针就整体向后移了一位;nextIndex++——记录移动的次数;返回lastReturned的值(返回第一根指针所指的值)”

于是我们就知道了next()的作用:记录下当前所指的值并返回,然后指向后一个元素 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值