Речь идет не только об эффективности, ИМО. Это примерно абстракция . Использование индекса связывает вас с коллекциями, которые могут эффективно извлекать элемент для данного индекса (скажем, он не будет хорошо работать со связанным списком) ... и он не выражает то, что вы ' пытаемся сделать, что итерация по списку.
С помощью итератора вы можете выразить идею итерации по последовательности элементов независимо от того, может ли эта последовательность быть легко проиндексирована или нет, независимо от того, известен ли размер заранее или нет, и даже в тех случаях, когда он фактически бесконечен.
Ваш второй случай все еще записывается с использованием цикла for
, который увеличивает index , что не является идиоматическим способом думать об этом - это просто проверка того, достиг ли он конца , Например, это может быть:
for (Node<E> nodeRef = head; nodeRef != null; nodeRef = nodeRef.next)
{
}
Теперь у нас есть правильная абстракция: цикл выражает то, с чего мы начинаем (голова), когда мы останавливаемся (когда больше нет элементов) и как мы переходим от одного элемента к другому (используя поле next
) , Это выражает идею более эффективной итерации, чем «У меня есть счетчик, начинающийся с 0, и я собираюсь запрашивать значение у конкретного счетчика на каждой итерации, пока значение счетчика не станет больше некоторого значения, которое происходит». быть длиной списка. "
Мы довольно использовали для последнего способа выражения вещей, но в действительности это не говорит о том, что мы имеем в виду, почти так же, как и итераторский подход.