Что произойдет, если вы вызовете один и тот же итератор дважды в одной коллекции? - PullRequest
9 голосов
/ 30 сентября 2010

Если я настрою итератор для myList:

Iterator iter = myList.iterator();
while(iter.hasNext())
{
    MyObj myObj = (MyObj)iter.next();
    doPrint(myObj.toString());
}

И я называю это во второй раз:

while(iter.hasNext())
{
    MyObj myObj = (MyObj)iter.next();
    doPrint(myObj.toString());
}

Вернется ли это к началу коллекции при втором вызове?

Ответы [ 3 ]

34 голосов
/ 30 сентября 2010

iter.hasNext() во втором цикле немедленно вернет false, поэтому код внутри цикла не будет выполнен.

Однако, если вы заново создадите итератор (list.iterator()), итерация будет перезапущена с начала.

10 голосов
/ 30 сентября 2010

Интерфейс итератора предоставляет только три метода:

  • hasNext ()
  • next ()
  • remove ()

Таким образом, нет никакого способа сказать итератору «сбросить», «перезапустить с начала» или «вернуться».Как только он находится на последнем элементе базовой последовательности, он выполняет свою работу, и нет необходимости сохранять ссылку.Шепот RIP и сделать его встретиться с Big GC.

3 голосов
/ 30 сентября 2010

Вторая часть не будет выполнена, потому что iter.hasNext () возвращает false ...

...