黑马程序员技术交流社区

标题: 关于集合中迭代器的一个奇怪现象 [打印本页]

作者: theNo.1    时间: 2014-5-11 17:12
标题: 关于集合中迭代器的一个奇怪现象
本帖最后由 theNo.1 于 2014-5-11 17:14 编辑

  在学习集合的时候发现了一个奇怪现象。如下:
发现出现了死循环,一直输出 AAA
但是将 sop(li.next()) 这句注释去掉 ,发现 程序正常打印 al 集合中的数据
由此得出 :
    1 . 在ListIterator 中 , hasNext() 方法,只判断下一个游标位置是否有元素存在,并没有发生游标的移动、
    2 . 移动游标的是 next() 方法, 每移动一次返回一次当前游标的对象。
证明 :   加入一个for循环,循环 集合元素个数+2 次,用hasNext方法判断是否有 元素存在 。

可以看到,结果为true , 可是集合中明明只有四个元素啊。 所以,这充分证明了 使用 hasNext方法 ,游标根本没有发生移动  。


作者: 钟成军    时间: 2014-5-11 17:28
恩,证明得比较好
作者: theNo.1    时间: 2014-5-11 18:07
钟成军 发表于 2014-5-11 17:28
恩,证明得比较好

:#                                         
作者: hx小龙    时间: 2014-5-11 21:38
看完整个了才明白过来,楼楼就是想说只有当it.next时脚标才会浮动,而hasNext只是判断。所以才会出现在缺少it.next的情况下出现死循环。
作者: GGdog    时间: 2014-5-11 22:03
有例子证明更形象化
作者: 孟凡超    时间: 2014-5-12 07:47
谢谢分享,,,,
作者: 小周务商    时间: 2014-5-12 09:34
你放在while里面时它就只是做判断的。
作者: theNo.1    时间: 2014-5-12 13:43
小周务商 发表于 2014-5-12 09:34
你放在while里面时它就只是做判断的。

hasNext 本来就是作判断的,不管是在里边还是在外边。 我这里 讨论的主要是在作判断的过程中,指针(游标)是否发生了移动 。从for循环的例子可以看出,指针是没有发生移动的,一直在当前位置
作者: theNo.1    时间: 2014-5-12 13:46
GGdog 发表于 2014-5-11 22:03
有例子证明更形象化

必须的 , 哈哈 :P
作者: theNo.1    时间: 2014-5-12 13:48
孟凡超 发表于 2014-5-12 07:47
谢谢分享,,,,

谢谢花这么长时间看  ;P
作者: ID1003    时间: 2014-5-18 18:26
嗯,确实是这样子的,证明的太犀利了。
作者: renshu16    时间: 2014-5-18 22:15
楼主挺有探索精神的哟
作者: Blackay    时间: 2014-5-19 21:23
本身那个hasNext  API里面就是说的hasNext是用来判断是否有 请看API:
   boolean hasNext()
如果仍有元素可以迭代,则返回 true。(换句话说,如果 next 返回了元素而不是抛出异常,则返回 true)。

返回:
如果迭代器具有多个元素,则返回 true。
作者: Blackay    时间: 2014-5-19 21:24
不过好像没有讲是否移动哈? 楼主还是挺有探索精神的 赞!刚刚操作失误,就发表了!!
作者: 远行的人2号    时间: 2014-5-20 00:20
楼主挺棒!
作者: yinxjfly    时间: 2014-5-24 00:55
赞一个!俺咋就没发现呢!!差距吖!
作者: shisishishisi    时间: 2014-5-26 17:29
证明的不错。。。精神可嘉。。。
作者: 不一样的颜色    时间: 2014-5-28 11:06
hasNext方法是在判断当前元素之后是否有下一个元素,如果没有紧接着调用next()方法,当然指针不会移动,返回的就会使TRUE。设想,如果hasNext方法会改动指针,就有可能导致你取出的元素和判断的元素不一致
作者: 为梦想而活着    时间: 2014-5-28 11:51
总共四个元素,打印true却成了无限循环,使用 hasNext方法到第五个没元素了怎么迭代的?没有元素了不是应该返回false吗??
作者: theNo.1    时间: 2014-5-29 01:31
为梦想而活着 发表于 2014-5-28 11:51
总共四个元素,打印true却成了无限循环,使用 hasNext方法到第五个没元素了怎么迭代的?没有元素了不是应该 ...

所以说啊,hasNext方法迭代的时候,指针永远停留在当前位置,没有发生移动。 而只有用next方法时,才移动了、所以才会永远返回true (当前位置的下一个元素存在) 。你再认真看看帖子就明白我所讲的了
作者: boolcardy    时间: 2014-5-29 13:01
我曾经也干过这种事儿,自习看看api的注释就行
作者: cain    时间: 2014-6-5 20:25
先用it.hasNext() 判断集合里是不是已经没有元素了

如果有就用
it.next();

就是取得当前集合的元素 然后把指针往后移一位指向下一个元素(java确实还是有指针的只不过你不能自己调用罢了)
作者: 、海    时间: 2014-6-9 20:53
next方法都注释了    就会一直问   集合里面还有没有元素   有    执行   打印AAA  此时没有next方法  里面就一直有元素   所以就无限循环了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2