Iterator<String> ir = arr.iterator();
while(ir.hasNext()) {
String an = ir.next();
System.out.println(an);
}
Run Code Online (Sandbox Code Playgroud)
在ArrayListir中返回指向第一个的列表对象.现在ir.next()必须指向下一个对象.那么为什么它在循环中第一次运行时指向第一个对象?
另外,
ListIterator<String> ir= arr.listIterator();
while(ir.hasNext())
{
String an= ir.next();
ir.set(an + '+');
System.out.println(an);
}
Run Code Online (Sandbox Code Playgroud)
为什么它不附加'+'?它只打印原件ArrayList.
hasNext()只是告诉你集合中是否有另一个元素可以迭代.next()实际上返回所述元素.光标的初始位置在第一个元素之前.
例如,假设您有以下内容:
0 1 2 3 4
| 8 | 5 | 2 | 3 | 7 |
Run Code Online (Sandbox Code Playgroud)
光标实际上指向第一个元素之前的位置:
0 1 2 3 4
| 8 | 5 | 2 | 3 | 7 |
^
|
cursor
Run Code Online (Sandbox Code Playgroud)
当你这样做时hasNext(),它会检查位置是否有任何东西cursor + 1.如果你有一个空列表,则没有任何内容cursor + 1(即索引处没有任何内容0),因此它将返回false.如果你在最后一个元素,cursor + 1 == list.size()这意味着在列表结束后没有任何内容.如果您在列表中的任何其他位置,cursor + 1则是填充的有效索引,因此它将返回true.
当你真正做的next(),它会向前移动光标,并在新的位置返回的元素.现在,光标位于下一个元素之前的新位置.
现在它内部完成的方式确实无关紧要.光标可能是第一次指向第一个元素.如果是这种情况,您需要的只是处理该场景的特殊逻辑(可能是一个检查next()是否曾被调用过的标志).
在a的情况下你需要理解的Iterator是,hasNext()它将告诉你是否有剩余的元素可以迭代,next()并将返回该元素.这种行为在调用之间是一致的,并且应该在所有实现中保持一致.