Iterator<String> ir = arr.iterator();
while(ir.hasNext()) {
String an = ir.next();
System.out.println(an);
}
在ArrayList
ir中,返回指向第一个的列表对象。
现在ir.next()
必须指向下一个对象。
那么为什么它在循环中第一次运行时指向第一个对象?
此外,
ListIterator<String> ir= arr.listIterator();
while(ir.hasNext())
{
String an= ir.next();
ir.set(an + '+');
System.out.println(an);
}
为什么它不附加'+'
?它只打印原始ArrayList
。
答案 0 :(得分:6)
hasNext()
只是告诉你 if 集合中是否有另一个可以迭代的元素。 next()
实际上返回了所述元素。 第一个元素之前光标的初始位置是。
例如,假设您有以下内容:
0 1 2 3 4
| 8 | 5 | 2 | 3 | 7 |
在第一个元素之前,光标实际指向的位置:
0 1 2 3 4
| 8 | 5 | 2 | 3 | 7 |
^
|
cursor
执行hasNext()
时,会检查位置cursor + 1
是否有任何内容。如果你有一个空列表,cursor + 1
没有任何内容(即索引0
没有),所以它将返回false。如果你在最后一个元素cursor + 1 == list.size()
,这意味着在列表结束后没有任何内容。如果您位于列表中的任何其他位置,则cursor + 1
是已填充的有效索引,因此它将返回true
。
当实际执行next()
时,它会使光标前进并将元素返回到新位置。现在,光标位于 next 元素之前的新位置。
现在它内部完成的方式确实无关紧要。光标可以第一次指向第一个元素。如果是这种情况,您需要的只是处理该场景的特殊逻辑(可能是一个标志,用于检查是否曾调用过next()
)。
在Iterator
的情况下,您需要了解的是hasNext()
将告诉您是否有剩余的元素可以迭代,next()
将返回该元素。这种行为在调用之间是一致的,并且在所有实现中都应该一致。
答案 1 :(得分:0)
Iterator
在第一次调用之前指向第一个项目并不是问题。
next
中发生的情况如下:
它确实始终指向“下一个”值,即使迭代完成且没有更多项目,在这种情况下也没有“下一个”项目。
这是example source code from ArrayList
's iterator,一个名为Itr
的内部类:
private class Itr implements Iterator<E>
int cursor; // index of next element to return
默认值为0
,已指向第一个元素。
next()
方法执行上述步骤(加上一些其他步骤以防止在迭代期间进行修改)。
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}