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 列表中的第一个元素。
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 列表中的第一个元素。