对迭代器的分析
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()的作用:记录下当前所指的值并返回,然后指向后一个元素