关于迭代器的原理-Iterator.next以及iterator.previous

针对迭代器的原理有两种说法:下面的两张图片分别对应这两种不太一样的原理。

                第一种:黑马阿伟老师说所的:创建迭代器对象时,就已经创建好了一个指针,并且指向了该集合的“0”索引位置,hasnext用来判断当前位置是否有元素,如果有,则返回true,那么next就会做两件事情:1、取走当前位置的元素。2、并且将指针移动到下一位置,然后进行循环操作,到最后很明显next取完最后一个元素时,并且将指针移动到了最后一个元素的边界外面

                 第二种:创建迭代器的时候,指针默认处在“-1”的索引位置上,然后见名知义,hasnext是用来判断下一位置是否有元素,即如果下一位置有元素就返回true,然后next就会做两件事情:1、将指针移动到下一位置。2、并且取走当前位置的元素。很明显到最后指针留在了最后一个位置。

                虽然两种说法看起来都没什么很大问题,但不免让人产生疑惑,那到底那种才是最为准确的的说法呢,于是我就进行测试了下,找到了相关对应的方法hasprevious和previou,按照上面不同的说法,那么hasprevious,previou的用法也不相同。然后枫枫做了个题目测试了一下下: 

                题目要求:先遍历一遍集合,并将所有元素给打印出来,然后再返回遍历集合,将集合元素里面以元音开头的字母给移除,然后再遍历打出集合中所剩下的元素。

 

 

                由题目要求可以不难想出使用hasprevious,previous方法,但是仔细思考下,按照上面的两种说法,按照第一种说法:那么hasprevious是判断当前位置有没有元素,若没有元素的话则返回false,previous是取出当前位置的元素并且将指针移到下一个位置。那么在这道题中,在第一遍遍历的时候明显指针指向最后一个元素的后面一个位置了,那么此时再用hasprevious,无疑会返回false,则不可能进行移除元素的操作了,更别谈遍历打印移除元素后的操作了。

                按照第二种说法呢,那么hasprevious是判断下一位置有没有元素,若有元素的话则会返回true,否则,返回false。previous先是将指针移到下一个位置并且取出当前位置的元素。那么在这道题中,在第一遍遍历的时候明显指针指向最后一个元素的位置了,即在“iii”这里,但是在返回遍历时,很明显,hasprevious判断下一位置有没有元素,发现有元素的话返回了true,此时,previous向后移动指针并且取出当且位置的元素,那么此时的"iii"很明显跳过了,所以“iii”并没有被移除,但在第二遍遍历集合打印的时候却发现"iii'并未打印出来,这说明这种说法也很难解释这一现象。

最后我觉定还是看看源码再去理解:

 诶,这源码是什么意思嘞?看不懂哇!宝子,不要慌啊,听我慢慢say来:先找主谓宾,再猜定状补,欧克,简单拿捏,源码的意思就是:

这段文本是JAVA编程语言中关于列表迭代器(ListIterator)的文档注释,主要描述了该迭代器的几个方法的功能和使用方法。

- `boolean hasNext()`:判断在向前遍历列表时,迭代器是否还有更多元素。如果调用`next`方法将返回一个元素而不是抛出异常,则返回`true`。
- `E next()`:获取列表中的下一个元素,并将迭代器的位置向前移动。可以重复调用该方法来迭代列表,也可以与调用`previous`方法交替使用以来回移动。(注意:交替调用`next`和`previous`将重复返回同一元素。)
- `boolean hasPrevious()`:判断在向后遍历列表时,迭代器是否还有更多元素。如果调用`previous`方法将返回一个元素而不是抛出异常,则返回`true`。
- `E previous()`:获取列表中的上一个元素,并将迭代器的位置向后移动。可以重复调用该方法来倒序迭代列表,也可以与调用`next`方法交替使用以来回移动。(注意:交替调用`next`和`previous`将重复返回同一元素。

结论:

这样一来便能很好的解释上述问题了。

最后,以上只是我个人对迭代器的见解,如果你有更好的理解的话可以写在评论区哦。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值