3

假设我运行这段代码,它向我展示了这个:1 10 2 10 3 10

public class Test1{
public static void main(String[] args) {
    LinkedList<Integer> list = new LinkedList<Integer>();
    list.add((1));
    list.add((2));
    list.add((3));
    ListIterator<Integer> it = list.listIterator();
    while(it.hasNext()){
        it.next();
        it.add((10));
    }
    for(Integer i : list){
        System.out.println(i);
    }        
}

我不明白为什么最后一个hasNext()发生甚至认为我们应该在列表的末尾(在我的理解中)。关于元素 3。

首先,迭代器在 1 上。hasNext()returntrue因为list后面有 2。所以我进入循环,it.next()返回我 1 并将光标设置为 2。当我添加 10 时,它发生在光标位置,因此在 1 和 2 之间。然后,it.next()返回我 2 并将光标设置为 3。然后我添加 10在 2 和 3 之间。但是此时,我没有 3 的下一个,那么为什么要hasNext()返回 true,在列表的最后一个位置添加 12?

4

2 回答 2

3

Java 中的迭代器被创建为指向列表开始之前的位置,因此如果列表有第一个元素,则第一次调用next()返回第一个元素。因此,您将查看列表中的所有项目,并10在每个项目之后添加。

于 2015-06-12T16:15:03.507 回答
2

光标始终位于元素之间。当您通过列表迭代器添加元素时,该项目将添加到光标的位置,并且光​​标将移动到您刚刚插入的项目之后。这也在javadoc 中进行了解释。

以这种方式考虑光标位置,按顺序:

    1      2       3
  ^
hasNext? yes => call next (returns 1)
    1      2       3
        ^
call add
    1      10      2       3
               ^
hasNext? yes => call next (returns 2)
    1      10      2       3
                       ^
call add
    1      10      2       10         3
                                ^
hasNext? yes => call next (returns 3)
    1      10      2       10         3
                                           ^
call add
    1      10      2       10         3       10
                                                       ^
hasNext? no => exit loop
于 2015-06-12T16:16:57.867 回答