Java 为什么listiterator中的hasPrevious()和add()组合会进入无限循环,而hasNext()和add()不会';T
具有两个元素的ArrayList 使用next遍历并向列表中添加元素“bye” 以上代码的输出为=[hai,拜拜,你好,拜拜] 遍历到列表的最后一个 使用prev向前遍历并向列表中添加元素“bye”Java 为什么listiterator中的hasPrevious()和add()组合会进入无限循环,而hasNext()和add()不会';T,java,collections,iterator,Java,Collections,Iterator,具有两个元素的ArrayList 使用next遍历并向列表中添加元素“bye” 以上代码的输出为=[hai,拜拜,你好,拜拜] 遍历到列表的最后一个 使用prev向前遍历并向列表中添加元素“bye” 无限大,什么也不打印好吧,ListIterator的add的Javadoc解释如下: 将指定的元素插入列表(可选操作)。该元素紧跟在next返回的元素之前(如果有),紧跟在previous返回的元素之后(如果有)。(如果列表中不包含任何元素,新元素将成为列表中的唯一元素。)新元素插入隐式光标之前:后
无限大,什么也不打印好吧,
ListIterator
的add
的Javadoc解释如下:
将指定的元素插入列表(可选操作)。该元素紧跟在next返回的元素之前(如果有),紧跟在previous返回的元素之后(如果有)。(如果列表中不包含任何元素,新元素将成为列表中的唯一元素。)新元素插入隐式光标之前:后续调用next将不受影响,后续调用previous将返回新元素
l.previous
返回您刚才通过l.add(“bye”)
添加的元素,因此您永远不会到达列表的开头。因此,无限循环
如果列表
如下所示:
hai hello
^
|
cursor
调用l.previous()代码>返回“hello”并向后移动光标:
hai hello
^
|
cursor
调用l.add(“再见”)代码>在“hai”和“hello”之间以及光标之前添加新元素:
hai bye hello
^
|
cursor
因此,对l.previous()
的下一次调用将返回“bye”
因此,您的循环永远不会到达列表的开头
是最后一个独立于其他循环的while循环吗?或者您同时运行上述所有代码?@MohammedDeifallah最后两个while循环将同时执行,因为我必须遍历到最后一个才能向前遍历!请浏览oracle文档:@GowthamPrasath然后,在最后一个循环中,您所做的是,如第一个答案中所述,您转到最后两个元素之间的位置。然后添加另一个元素。然后你再次转向相同的位置。。。等等。这是一个无限循环。@MohammedDeifallah我用next()做了同样的操作,但我并没有最终进入无限循环,只有previous()做了这件事。请仔细阅读oracle文档:
while(l.hasNext()) {
l.next();
}
while (l.hasPrevious()) {
l.previous();
l.add("bye");
}
System.out.println(a);
hai hello
^
|
cursor
hai hello
^
|
cursor
hai bye hello
^
|
cursor