Java 为什么列表迭代器.next();回到“我的朋友”;“无当前元素”;位置,除非重复多次直到结束?

Java 为什么列表迭代器.next();回到“我的朋友”;“无当前元素”;位置,除非重复多次直到结束?,java,linked-list,listiterator,Java,Linked List,Listiterator,根据Java文档: ListIterator没有当前元素;其光标位置始终位于 在调用previous()返回的元素和 调用next()将返回的元素。迭代器 对于长度为n的列表,有n+1个可能的光标位置,如下所示 用以下插入符号(^)进行说明: 例如,我的问题是,假设一个while循环正在运行,按下2键时,我调用一个方法 public void callNextElement(int choice, LinkedList<String> linkedList) { ListI

根据Java文档:

ListIterator没有当前元素;其光标位置始终位于 在调用previous()返回的元素和 调用next()将返回的元素。迭代器 对于长度为n的列表,有n+1个可能的光标位置,如下所示 用以下插入符号(^)进行说明:

例如,我的问题是,假设一个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());
        }
    }
}
这将打印链接列表中的其他元素

因此,我的问题是:

  • 为什么它不打印出我调用的方法中的第二个元素等等

  • 为什么它只在listiterator.next()被连续调用时才起作用,就像我在上面打印它们一样

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

  • 编辑:


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

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

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

    如果要对连续的元素进行迭代,需要调用一次
    listIterator()
    ,并将迭代器保存在某个位置以便重用。

    要回答您的问题,您需要了解
    iterator
    记住它在
    集合中的位置,但是只有
    迭代器的同一个实例知道这个位置(即调用了多少次
    迭代器.next()

    1) 为什么它不打印出我调用的方法中的第二个元素等等

    此方法的调用方式如下:

    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);
    }
    
    ListIterator ListIterator=linkedList.ListIterator();
    while(条件==true){
    callNextElement(选项、列表迭代器);
    }
    
    通过这种方式,您将始终将相同的
    迭代器
    传递给callNextElement方法,并依次提升该迭代器的位置


    不,这绝对与垃圾收集无关。

    重新编辑:不,这与垃圾收集无关。Is只与以下事实有关:每个
    linkedList.listIterator()
    使用其自身的位置信息创建新的列表迭代器(在本例中,它将是列表的开始,因此单独的新列表迭代器上的每个
    next()
    都将产生第一个元素-假设列表不是空的)。
    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);
    }