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

时间:2016-05-18 11:34:34

标签: java arraylist infinite-loop listiterator

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

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

这会产生一个带有“test”的无限循环线。为什么会发生这种情况以及如何解决?

8 个答案:

答案 0 :(得分:11)

为hasNext创建的迭代器与下一个迭代器不同。

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

这里:

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());

}

答案 3 :(得分:1)

使用此代码,

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());
}

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

您每次都在呼叫 listIterator 。尝试分配一个变量并循环遍历它。

答案 6 :(得分:0)

list.listIterator()返回新的迭代器。以下是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());
        }

答案 7 :(得分:0)

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

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

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

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