Почему java.util.Collection напрямую не определяет next (), hasNext ()? - PullRequest
6 голосов
/ 02 сентября 2010

Если Коллекция определяет hasNext () вместо iterator (). HasNext () , мы могли бы написать цикл проще:

while(collection.hasNext()){…}

вместо:

Iterator it= collection.iterator();
While(it.hasNext()){…}

Конечно, я знаю, что простой способ для цикла for(E e:collection) существует.

Почему существует интерфейс Iterator?

Ответы [ 4 ]

9 голосов
/ 02 сентября 2010

Поскольку вы можете иметь несколько действительных Iterator объектов для одного и того же Collection объекта одновременно.

Это может быть полезно.Если Collection определит методы next и hasNext, такой подход будет исключен.

7 голосов
/ 02 сентября 2010

Это не будет потокобезопасным .Коллекция сможет поддерживать только одну «текущую позицию», поэтому вы не можете выполнять итерацию по ней одновременно в двух разных потоках.

Наличие итераторов позволяет одновременно выполнять несколько итерационных потоков, которые не наступают друг другу на пальцы.

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

Я понимаю, что логическое обоснование того, что итераторы выделяются из коллекции, состоит в том, что их может быть много видов (кроме простого продвижения вперед по коллекции). Вы можете создать свой собственный итератор, чтобы вернуться назад или сделать что-то вроде перебора графа DOM, посещающего все узлы.

2 голосов
/ 02 сентября 2010

Основная причина в том, что в коллекции должна быть итерация "состояние". Вы не можете поддерживать несколько итераций одновременно. PHP-массивы имеют что-то вроде встроенного состояния итерации, и это меня смутило.

...