linklist.iterator()。next()如何工作?

时间:2019-01-13 12:54:24

标签: java iterator

我试图了解在第一个元素的情况下迭代器如何工作。 就像我们第一次调用iterator.next()一样,为什么它返回0索引而不是1? 有一个类似的线程在某种程度上回答了这个问题,但是它本身的代码似乎不匹配。 How does next() method on iterators work?

通过此代码,似乎下一个方法实际上返回了当前元素并将光标移至下一个。

@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];
}

那么考虑该方法的正确方法是哪种? 我应该简单地忽略Java文档,并将其视为返回当前值并移至下一个吗?

3 个答案:

答案 0 :(得分:1)

  

就像我们第一次调用iterator.next()的原因一样   返回0索引而不是1?

因为列表上的迭代器如果不允许您迭代基础列表的所有元素,则将存在严重缺陷。

  

那么考虑该方法的正确方法是哪种?我是不是该   只需忽略Java文档,然后将其视为返回电流并移动   到下一个?

不。您的思维模型与文档不一致,您应该首先考虑是否需要调整模型。在这种情况下,您可能会得出一个更好的模型:

  • 对于任何迭代器,都有可能为空的项目序列会对其进行迭代。 next()方法返回迭代器尚未返回的下一个。

  • 因为它适用于Lists,所以将迭代器视为完全具有 current 元素是没有帮助的。它具有下一个元素(也许)和上一个元素(也许),但是没有当前元素。您可以将其视为指向 之间的元素,或者指向 前一个或最后一个。

答案 1 :(得分:0)

cursor初始化为0,由于next()返回索引为cursor的元素(递增cursor之前的值,该值被存储在i中,对next()的第一次调用返回第一个元素(索引为0)。

此迭代器的不变之处在于cursor始终保存下一个元素的索引。 因此,每次对next()的调用都会返回其索引为cursor的元素,并递增cursor

答案 2 :(得分:0)

因为您还没有看到任何元素,所以第一个元素是'next'。迭代器的初始位置在第一个元素的前面。

考虑商店中的柜台。柜台后面有一家商店的员工,但他尚未接待任何顾客。客户出现并排成一行。

没有“当前”客户。没有人送达。

员工现在可以随时与客户见面,并打电话给“下一位客户”。行首的人向前走。他/她现在是“当前”客户。