了解iterator.next的功能

时间:2014-02-18 21:25:32

标签: java collections

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

2 个答案:

答案 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中发生的情况如下:

  1. 存储稍后要返回的当前值。
  2. 将索引提升到超出当前值的下一个值(如果不在列表末尾,则为“无”)。
  3. 从步骤1返回当前值。
  4. 它确实始终指向“下一个”值,即使迭代完成且没有更多项目,在这种情况下也没有“下一个”项目。

    这是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];
    }