Java: разница между итераторами и массивами - PullRequest
2 голосов
/ 10 марта 2010

Как бы вы объяснили кому-то, кто только начал программировать на Java, в чем разница между ArrayLists и Iterators?

Почему я бы использовал итератор вместо методов get () Arraylist

Ответы [ 3 ]

5 голосов
/ 10 марта 2010

ArrayList - это фактическая структура данных, реализация интерфейса List. Итератор - это просто интерфейс, который позволяет вам перемещаться по любой структуре данных (при условии, что для этой структуры данных доступен итератор).

Другими словами, ArrayList - это фактический список ссылок на объекты (или примитивы), которые физически хранятся в массиве. ArrayList является «реализацией» интерфейса List, то есть он предоставляет реализации всех методов, которые применимы к List, таких как add (объект), remove (объект), get (индекс) и т. Д.

Итератор - это более общий способ навигации по любой структуре данных, будь то множество, список или что-то еще. Одним из важных моментов является то, что он позволяет вам перемещаться по каждому элементу в структуре данных один раз, и тогда все готово. Из документации видно, что Iterator предписывает два метода, next () и hasNext (). next возвращает следующий элемент в базовой структуре данных, а hasNext позволяет узнать, существует ли хотя бы следующий элемент в базовой структуре данных. Несколько структур данных, включая ArrayList, могут предоставить вам итератор.

Почему я бы использовал итератор вместо методов get () Arraylist?

Что ж, как и многие интерфейсы, Iterator позволяет вам делать одно и то же, независимо от базовой реализации. Если я хочу «перебрать» некоторую структуру данных, я могу либо

a) написать код, специально предназначенный для структуры данных (такой как ArrayList), который мне придется изменить позже, если я изменю структуру данных на что-то другое (например, HashSet) или

b) получить Итератор из структуры данных и использовать тот же метод hasNext / next, который будет работать, даже если я изменю структуру данных на что-то другое.

К вашему сведению, если вы не слишком знакомы со словами «интерфейс» и «реализация», вам, вероятно, следует выполнить поиск в Google по «интерфейсу Java».

3 голосов
/ 10 марта 2010

ArrayList - это особый вид List. Это структура данных , похожая на дерево, карту или список.

Итератор является примером шаблона проектирования для обхода структуры данных. Вы не перемещаетесь по списку так же, как и по бинарному дереву, но итератор предоставляет интерфейс, который описывает то, что является общим для всех навигаторов структуры данных.

Таким образом, вы можете использовать Iterator для обхода ArrayList. Они не одно и то же. Один навигатор, другой контейнер.

Так почему же вы предпочитаете Iterator, а не просто используете метод get () для ArrayList?

Не во всех коллекциях есть метод get () (например, Collection и Set и двоичное дерево). Если вам нужно переключиться с ArrayList на одну из этих структур данных, вы должны также переписать весь код, который вызывает get ().

Но если вы возвращаете Iterator, клиенты кода не должны знать, что вы изменили реализации.

Если вы используете get (), вы используете реализацию, которая вам дана. Если вы используете интерфейс Iterator, вы можете поменять местами реализации для выполнения таких задач, как интеллектуальное проксирование, не затрагивая клиентов.

Речь идет о сокрытии подробностей о навигации от клиентов класса. Если вы просто используете ArrayList, это может не иметь большого значения. Но если вы разрабатываете собственные классы, вы можете обнаружить, что Iterator дает вам хороший способ раскрыть поведение, не раскрывая личных деталей.

2 голосов
/ 10 марта 2010

Просмотрите это руководство от Sun о том, как использовать итераторы в классах, реализующих интерфейс Collection (включая, конечно, ArrayList).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...