如果列表只有一个元素会更清楚,比如说“b”。hasNext()
实际上会返回 true,并next()
会读取它,然后迭代将结束。
解释:
如果你调用Iterator<Object> it= list.iterator()
任何非空列表(即使它只有一个元素),你会得到true
调用hasNext()
. 这是因为迭代器在第一个元素之前被初始化:
b u n g i o r n o
^
i - iterator
当你调用next()
它时,它会做两件事:
- 它读取迭代器前面的元素,
- 将迭代器移动到刚刚读取的元素之后,下一个元素之前。
在您的示例中 - 它打印“b”并在“u”之前停止:
b u n g i o r n o
^
i
就在结束之前:
b u n g i o r n o
^
i
它实际上具有下一个值 - “o”。调用next()
将读取该值并在o
. 没有更多的元素。hasNext()
将显示为 false,调用next()
将导致异常。
技术细节:
实现迭代器的基本思路是这样的: - 当Iterator
通过调用iterator()
on 创建 aList
时,其内部变量被调用next
指向列表的第一个元素。-hasNext()
只是检查是否next
是!= null
. -next()
返回next
并设置next
以显示下一个元素。
这是java.util.ArrayList
迭代器(省略了一些细节):
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size;
}
public E next() {
checkForComodification();
int i = cursor;
Object[] elementData = ArrayList.this.elementData;
cursor = i + 1;
return (E) elementData[lastRet = i];
}
}