【发布时间】:2019-06-07 16:58:26
【问题描述】:
我试图了解迭代器在第一个元素的情况下如何工作。 就像我们第一次调用 iterator.next() 一样,为什么它返回 0 索引而不是 1? 有一个类似的线程在某种程度上回答了这个问题,但它本身的代码似乎不匹配。 How does next() method on iterators work?
通过这段代码,看起来实际上 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];
}
那么考虑这种方法的正确方法是什么? 我是否应该简单地忽略 java 文档,并将其视为返回当前并移至下一个?
【问题讨论】:
-
我没有看到与文档的冲突。在这种情况下,您可能不理解“下一步”这个词。它的意思是“下一个可用的数据”。因此,当没有读取以前的项目时,下一个可用的就是第一个。
-
在您发布的代码中,没有任何内容表明
cursor指向“当前”元素。您在心理上将cursor和“当前”等同起来,但实际上并非如此。cursor只是不影响迭代器接口的实现细节。实现者本可以选择将其初始化为 -1 并相应地更改实现,但显然发现这种方法更简单。