ArrayList<String> list = new ArrayList<String>();
list.add("test");
while(list.listIterator().hasNext()) {
System.out.println(list.listIterator().next());
}
这会产生一个带有“test”的无限循环线。为什么会发生这种情况以及如何解决?
答案 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());
}