Было бы более ясно, если бы в списке был только один элемент, скажем, «b». hasNext()
действительно вернет true, и next()
прочитает его, и после этого итерация закончится.
Объяснение:
Если вы звоните Iterator<Object> it= list.iterator()
на любой непустого списка (даже если он имеет только один элемент), вы получите true
для вызова hasNext()
. Это происходит потому, что итератор инициализируется перед первым элементом:
b u n g i o r n o
^
i - iterator
И когда вы звоните next()
это делает две вещи:
- считывает элемент перед итератора,
- перемещает итератор сразу после элемента, который был только что прочитан, и до следующего.
В вашем примере - она печатает "б" и останавливается перед "U":
b u n g i o r n o
^
i
И только до конца:
b u n g i o r n o
^
i
Это на самом деле имеет следующее значение - «о». Вызов next()
будет читать это значение и прыгать после o
. Больше нет элементов. hasNext()
отобразит false, а вызов next()
приведет к исключению.
Технические данные:
Основная идея, как реализуется итератора заключается в следующем: - когда Iterator
создается путем вызова iterator()
на List
, его внутренняя переменная называется 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];
}
}
Здравствуйте, благодарю вас за ответ. В моей итальянской книге написано «следующее возвращает значения положения итератора, а затем переводит итератор в следующую позицию». Это правильно? – testermaster
@DanieleImpagliazzo No. Он возвращает следующее значение после текущей позиции. –