java—迭代器上的next()方法是如何工作的?

d5vmydt9  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(322)

我对这个问题有疑问 next() 方法。如果我的代码中有这样一行 arrayOfStrings 尺寸=4):

Iterator<String> it = arrayOfStrings.iterator(); //arrayOfString is ArrayList<String>

while(it.hasNext()) {
    String e = it.next();
    System.out.println(e);
}

在第一次迭代时,迭代器开始指向索引为0的元素?或者像“索引-1”?
我问是因为据我所知 next() 方法返回集合中的下一个元素。
所以,如果在第一次迭代时,迭代器从索引0开始,当 next() 调用时,它返回索引1处的元素,我赢了´无法对索引0处的元素执行任何操作?

flvtvl50

flvtvl501#

想想 next 分两步进行。首先它在迭代器中获取下一项,然后它增加指针以指向下一项。因此,当您创建一个新的迭代器时,它将被初始化以返回列表中的第一项(索引0)。

5cg8jx4n

5cg8jx4n2#

我想象迭代器工作方式的方式是把它看作是放在索引之间的东西。所以当第一个 next() 您可以返回存储在[0]索引下的值,调用之后,迭代器在索引[0]和[1]之间等待下一次调用返回存储在索引[1]中的值。第二次之后 next() 调用迭代器在[1]和[2]之间等待,依此类推。。。
这只是我习惯迭代器的方法,但它可能会对您有所帮助。

yb3bgrhw

yb3bgrhw3#

您显示的代码将正确打印 ArrayList . 这个 it.next() call在第一次调用时也是第一个元素。这个元素通常用索引0表示。
请注意,您可能需要重命名 arrayOfStrings 从技术上讲,它不是数组,它更像一个数组 List . 用户可能会认为它是一个数组。

文件

在我看来,你是对的,该方法的文档可能有点混乱,因为它非常紧凑:
返回迭代中的下一个元素。
然而,描述可能需要如此详细,因为 Iterator 是一个非常常用的接口,不仅用于集合。我可以想象一个类,其中第一个迭代元素不应该是底层结构的第一个元素。例如,在给定点之前已经读取的某种流。所以基本上是由实现类来决定第一个元素是什么。但对于集合,它将真正成为第一个元素(索引0)。

对于每个

还要注意,您展示的迭代相当于扩展for循环(for each)在java中的工作方式。所以像这样的语法

for (Item item : items) {
    ...
}

会被当作

Iterator<Item> iter = items.iterator();
while(iter.hasNext()) {
    Item item = iter.next();
    ...
}

事实上,这就是为什么您可以使用所有实现 Iterable 在扩展for循环中。
知道这一点,如果 iter.next() 将跳过第一个元素。我的意思是每个元素的名字应该迭代所有元素。

洞察

让我们仔细看看这个方法是如何实现的。所以我们先看看 ArrayList#iterator 做。看看它的源代码:

public Iterator<E> iterator() {
    return new Itr();
}

这个 Itr 类是类的私有类 ArrayList (源代码)。这里是 Itr#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];
}

所以它本质上返回的是索引处的元素 i 这就是游标在调用方法时所处的位置。在下一次调用方法时,它也已经将游标前进了一步。
但是,游标隐式初始化为 0 原因:

int cursor; // Default value for int is 0

所以第一个电话 next 将返回索引处的元素 0 这是第一个元素。

相关问题