Java - 使用 ListIterator .hasNext() 的无限循环

Java - Endless loop with ListIterator .hasNext()

ArrayList<String> list = new ArrayList<String>();
list.add("test");

while(list.listIterator().hasNext()) {
    System.out.println(list.listIterator().next());
}

这会生成无限循环的行 "test"。为什么会发生这种情况以及如何解决?

为 hasNext 创建的迭代器与为 next 创建的迭代器不同。

ArrayList<String> list = new ArrayList<String>();
list.add("test");
Iterator listIterator = list.listIterator()
while(listIterator.hasNext()) {
        System.out.println(listIterator.next());
}

您在每次 list.listIterator() 调用中创建迭代器的新实例。

在循环开始之前创建一次列表迭代器来解决您的问题。

你每次都调用 listIterator。尝试分配给一个变量并对其进行循环。

list.listIterator() returns 新迭代器。以下是 AbstractList

的来源
  public ListIterator<E> listIterator() {
        return listIterator(0);
    }
  public ListIterator<E> listIterator(int location) {
        return new FullListIterator(location);
    }

你应该像这样制作循环,

ArrayList<String> list = new ArrayList<String>();
list.add("test");
Iterator<String> iterator = list.listIterator();
while(iterator .hasNext()) {
        System.out.println(iterator.next());
        }

您的问题是您在每次 list.listIterator() 调用时都创建了新的迭代器。所有新实例都将位于迭代器的开头。如果您使用相同的迭代器,您可以修复它:

    ArrayList<String> list = new ArrayList<String>();
    list.add("test");

    Iterator<String> iterator = list.listIterator();

    while(iterator.hasNext()) {
        System.out.println(iterator.next());
    }

此处:

System.out.println(list.listIterator().next());

每次尝试打印出下一个元素时,您都会创建一个新的迭代器。

只需尝试以下操作:

ArrayList<String> list = new ArrayList<String>();

list.add("test");

Iterator<String> it = list.iterator();

while(it.hasNext()) {

    System.out.println(it.next());

}

使用此代码,

List<String> list = new ArrayList<String>();
ListIterator<String> litr = null;
list.add("test");
litr=list.listIterator();
System.out.println("Elements in forward directiton");
while(litr.hasNext()){
   System.out.println(litr.next());
}

由于您在每个循环中都创建了一个新的迭代器,因此新创建的迭代器指针将位于列表中的第一个元素之前。在这种情况下,hasNext() 方法将始终 return 为真,而 next() 方法将 return 列表中的第一个元素。