Java 为什么listiterator中的hasPrevious()和add()组合会进入无限循环,而hasNext()和add()不会';T

Java 为什么listiterator中的hasPrevious()和add()组合会进入无限循环,而hasNext()和add()不会';T,java,collections,iterator,Java,Collections,Iterator,具有两个元素的ArrayList 使用next遍历并向列表中添加元素“bye” 以上代码的输出为=[hai,拜拜,你好,拜拜] 遍历到列表的最后一个 使用prev向前遍历并向列表中添加元素“bye” 无限大,什么也不打印好吧,ListIterator的add的Javadoc解释如下: 将指定的元素插入列表(可选操作)。该元素紧跟在next返回的元素之前(如果有),紧跟在previous返回的元素之后(如果有)。(如果列表中不包含任何元素,新元素将成为列表中的唯一元素。)新元素插入隐式光标之前:后

具有两个元素的ArrayList

使用next遍历并向列表中添加元素“bye”

以上代码的输出为=[hai,拜拜,你好,拜拜]

遍历到列表的最后一个

使用prev向前遍历并向列表中添加元素“bye”


无限大,什么也不打印

好吧,
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