Iterator
просто используется для итерации по коллекции. В этом случае вы могли бы использовать for-each для того же результата:
for(String name : names){
System.out.println(name);
}
Однако, исходя из вашего вопроса, я предполагаю, что вы хотите перебрать Queue
, выскакивание и печать каждого элемента в порядке FIFO (отсюда и использование вашего LinkedList
). В этом случае вы можете просто захотеть l oop names.size()
количество раз и вызвать .remove()
, чтобы выдавать элемент на каждой итерации, например:
for(int n = names.size(); n > 0; n--){
String name = names.remove();
System.out.println(name);
}
Вывод:
Queue before the loop: [First, Middle, Last]
Printing loop...
First
Middle
Last
Queue after the loop: []
Попробуйте онлайн.
РЕДАКТИРОВАТЬ: чтобы немного подробнее объяснить, что происходит с .iterator()
:
Если мы посмотрим на исходный код Iterator
, то увидим интерфейс. Каждая реализация коллекции будет иметь свою собственную индивидуальную реализацию итератора.
Если посмотреть на исходный код Queue
, метод iterator()
выглядит так:
/**
* Returns an iterator that iterates over the items in this queue in FIFO order.
*
* @return an iterator that iterates over the items in this queue in FIFO order
*/
public Iterator<Item> iterator() {
return new ListIterator();
}
// an iterator, doesn't implement remove() since it's optional
private class ListIterator implements Iterator<Item> {
private Node current = first; // node containing current item
public boolean hasNext() {
return current != null;
}
public void remove() {
throw new UnsupportedOperationException();
}
public Item next() {
if (!hasNext()) throw new NoSuchElementException();
Item item = current.item;
current = current.next;
return item;
}
}
As вы можете видеть, что он сохраняет Node first
очереди как свой current
, когда ListIterator
создается в методе iterator()
.
В фактическом методе next()
он не использует ни remove()
ни poll()
методов Очереди (ни get()
..), поэтому элементы фактически не всплывают. Вместо этого он просто временно сохраняет текущий узел с Item item = current.item
; затем обновляет узел current
до следующего с помощью current = current.next
; после чего он вернет этот временный item
.