了解iterator.next的功能

hit*_*esh 0 java collections

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.

Viv*_*ath 6

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()并将返回该元素.这种行为在调用之间是一致的,并且应该在所有实现中保持一致.