对迭代器的分析
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()的作用:记录下当前所指的值并返回,然后指向后一个元素
本文主要对Java迭代器进行分析。介绍了迭代器的使用方法,通过调试代码建立链表模型,推测出迭代器使用两个指针在链表中移动并打印内容的工作原理。还分析了hasNext()用于判断链表中是否还有未处理元素,next()用于记录并返回当前值,然后指向下一个元素。
及next()的解析&spm=1001.2101.3001.5002&articleId=132079920&d=1&t=3&u=7c468f0d896c4dd885488b4116f44e12)
1万+

被折叠的 条评论
为什么被折叠?



