Использование перечислений / итераторов Java - PullRequest
1 голос
/ 14 апреля 2011

Я просто бродил по API, и до меня дошло, что перечисления и итераторы не очень полезные интерфейсы.

В частности, я имею в виду, вместо того, чтобы сказать (для Vector v):

for (Enumeration<E> e = v.elements(); e.hasMoreElements();)
   System.out.println(e.nextElement());

Мы можем легко сказать:

for (int i = 0; i < v.size(); i++)
   System.out.println(v.elementAt(i));

Что я хотел точно знать:

Существуют ли какие-либо бонусы за производительность при использовании перечислений / итераторов?

Предоставил ли он вам возможность достичь чего-то, чего не может достичь последний цикл for?

Ответы [ 5 ]

7 голосов
/ 14 апреля 2011

Не все, что имеет Iterator, является произвольным доступом List. Например, Set не разрешает индексированный доступ. LinkedList допускает это, но циклы по индексу будут иметь ужасную производительность.

Другие вещи, которые вообще не являются Collection, имеют Iterator с или могут быть также представлены как Iterator. Например, можно представить бесконечную последовательность с Iterator.

Наличие простого общего интерфейса, который используется для итерации по всем объектам, позволяет использовать методы, которые могут работать с максимально широким спектром объектов.

Кроме того, Vector и Enumeration устарели и в основном заменены в современной Java на ArrayList и Iterator соответственно.

7 голосов
/ 14 апреля 2011

Я не думаю, что итераторы и перечисления связаны с производительностью;они о лучшей абстракции.

Вам не нужно ничего знать о базовой структуре данных, если у вас есть итератор.Поэтому я считаю, что этот интерфейс вполне приемлем.Я не согласен с вашим утверждением, что Iterator не является полезным интерфейсом.Какие методы вы бы добавили?

3 голосов
/ 14 апреля 2011

Помимо того факта, что перечислители и итераторы лучше выражают то, что вы пытаетесь сделать, когда вы пытаетесь обойти значения в коллекции, и абстрагируете детали конкретного типа коллекции, как упоминалось Даффимо, интерфейс Iteratorпозволяет использовать более элегантный синтаксис for, например:

List<String> list = new ArrayList<String>();
for(String entry : list)
{
    System.out.println(list);
}
0 голосов
/ 14 апреля 2011

итератор о развязке и инкапсуляции. Вам не нужно заботиться о разнице в структуре данных, итератор имеет уникальный API для предоставления. В результате клиентскому коду не нужно слишком много исправлений, даже если коллекция изменилась. До версии 1.5 мы использовали интерфейс для управления некоторыми статическими конечными полями. Вы можете сравнить их, написав несколько примеров кодов (например, enum поддерживает переключатель)

0 голосов
/ 14 апреля 2011

Безопасно изменять список во время итерации, используя метод Iterator.hasNext (). Если вы просто проверите, меньше ли индекс исходного размера, вы можете столкнуться с проблемами ...

...