为什么 list-iterator.next();回到 "no current element" 的位置,除非重复多次直到结束?

Why does list-iterator.next(); goes back to "no current element" position unless it is iterated multiple times till end?

根据 Java 文档:

A ListIterator has no current element; its cursor position always lies between the element that would be returned by a call to previous() and the element that would be returned by a call to next(). An iterator for a list of length n has n+1 possible cursor positions, as illustrated by the carets (^) below:

我的问题是,例如,假设一个 while 循环正在运行并且在按下 2 时,我调用了一个方法

public void callNextElement(int choice, LinkedList<String> linkedList) {

    ListIterator<String> listIterator = linkedList.listIterator();
    if (choice == 2) {
        if (listIterator.hasNext()){
            listIterator.next();
            System.out.println("We have: " + listIterator.next());
        }
    }
}

现在,这将打印第一个元素并返回到 while 循环以获取输入,现在再次按 2,我将获得列表的第一个 element/entry。如果我这样做了:

System.out.println("We have: " + listIterator.next());
System.out.println("We have: " + listIterator.next());
System.out.println("We have: " + listIterator.next());
System.out.println("We have: " + listIterator.next());
....

这将打印链表中的其他元素

所以我的问题是:

  1. 为什么我调用的方法中没有打印出第2个元素等等?

  2. 为什么它 只工作 如果 listiterator.next() 像我上面打印的那样连续调用?

  3. 如果 listiterator 实际上会存储下一个元素位置,这样即使 next() 调用(没有连续)它也会打印下一个元素,会发生什么情况?不是第一个。

编辑:

我觉得自己很蠢,但是 Java 的垃圾收集在我的方法调用中起作用了吗?如果是,那么为什么它每次都打印第一个元素是有道理的。我是 Java 的新手,完全忘记了这一点...

每个列表迭代器在列表中都有自己独立的位置。每次调用 listIterator() 时,都会得到一个从列表开头开始的 new 迭代器。

ListIterator<String> listIterator = linkedList.listIterator();

如果您想遍历连续的元素,您需要调用 listIterator() 一次并将迭代器保存在某处以便可以重复使用。

要回答您的问题,您需要了解 Iterator 记住它在 CollectionIterable 中的位置,但只有 Iterator 的同一实例知道这一点位置(即调用了多少次 Iterator.next()

1) Why doesnt it print out the 2nd element and so on in the method i called?

ListIterator<String> listIterator = linkedList.listIterator();

在您方法的这一行中,您每次调用此方法时都会为列表创建一个 new Iterator。新的 Iterator 将始终从列表的开头开始。这就是为什么你总是只能得到列表的第一个元素。

2)Why does it only works if listiterator.next() is called in a sucession ? like I did by printing them above.

如上所述,新的迭代器将始终从列表的第一个元素开始(或更准确地说之前)。通过调用 Iterator.next() 可以将迭代器移动到列表的下一个元素。如果您在 相同的 Iterator 上多次调用 next(),您将遍历整个列表,直到 Iterator.hasNext() returns false.如果 Iterator.hasNext()false 并且您继续调用 Iterator.next() 将抛出 NoSuchElementException

3) What happens if listiterator would actually store the next element position so that when even if next() called (without succession) it would print the next element ? Not the first one.

我认为上面已经回答了这个问题?!

您可以更改方法以接受 Iterator 本身作为参数,而不是像这样的列表:

public void callNextElement(int choice, ListIterator<String> listIterator) {
    if (choice == 2) {
        if (listIterator.hasNext()){
            listIterator.next()
            System.out.println("We have: " + listIterator.next());
        }
    }
}

这个方法会这样调用:

ListIterator<String> listIterator = linkedList.listIterator();
while (condition == true) {
    callNextElement(choice, listIterator);
}

这样您将始终将 same Iterator 传递给 callNextElement 方法并连续推进此迭代器的位置。

不,这与垃圾收集完全无关。