Каковы преимущества интерфейса Iterator в Java? - PullRequest
34 голосов
/ 18 сентября 2008

Я только что узнал о том, как Java Collections Framework реализует структуры данных в связанных списках. Из того, что я понимаю, Iterators - это способ обхода элементов в структуре данных, такой как список. Почему этот интерфейс используется? Почему методы hasNext(), next() и remove() не закодированы непосредственно в самой реализации структуры данных?

С веб-сайта Java: текст ссылки

открытый интерфейс Iterator

An итератор над коллекцией. Итератор занимает место Перечисления в Фреймворк коллекций Java. итераторы Отличаться от перечислений можно двумя способами:

  • Итераторы позволяют вызывающему удалить элементы из базового сбор во время итерации с четко определенная семантика.
  • Имена методов были улучшены.
Этот интерфейс член коллекции Java Framework.

Я попытался погуглить и, похоже, не нашел определенного ответа. Может кто-нибудь пролить свет на то, почему Sun решила использовать их? Это из-за лучшего дизайна? Повышенная безопасность? Хорошая ОО практика?

Любая помощь будет принята с благодарностью. Спасибо.

Ответы [ 16 ]

0 голосов
/ 21 октября 2015

Интерфейс java.util.Iterator используется в платформе Java Collections Framework, чтобы разрешить изменение коллекции, продолжая итерацию по ней. Если вы просто хотите аккуратно выполнить итерацию по всей коллекции, используйте вместо этого for-each, но плюс Итераторов - это функциональность, которую вы получаете: необязательная операция remove (), и еще лучше для интерфейса List Iterator, который предлагает добавление () и set () тоже операции. Оба этих интерфейса позволяют перебирать коллекцию и изменять ее структурно одновременно. Попытка изменить коллекцию во время итерации по ней с помощью for-each выдает исключение ConcurrentModificationException, обычно потому, что коллекция неожиданно изменена!

Взгляните на класс ArrayList

Внутри него есть 2 частных класса (внутренние классы). называется Itr и ListItr

Они реализуют интерфейсы Iterator и ListIterator соответственно

открытый класс ArrayList ..... {// закрывающий класс

  private class Itr implements Iterator<E> {

        public E next() {
            return ArrayList.this.get(index++); //rough, not exact
        }

        //we have to use ArrayList.this.get() so the compiler will
        //know that we are referring to the methods in the 
        //enclosing ArrayList class

        public void remove() {
            ArrayList.this.remove(prevIndex);
        }

        //checks for...co mod of the list
        final void checkForComodification() {  //ListItr gets this method as well
             if (ArrayList.this.modCount != expectedModCount) { 
                 throw new ConcurrentModificationException();
             }
        }
  }

  private class ListItr extends Itr implements ListIterator<E> {
         //methods inherted....
        public void add(E e) {
            ArrayList.this.add(cursor, e);
        }

        public void set(E e) {
            ArrayList.this.set(cursor, e);
        }
  }

}

Когда вы вызываете методы iterator () и listIterator (), они возвращают новый экземпляр закрытого класса Itr или ListItr, и поскольку эти внутренние классы находятся «внутри» включающего класса ArrayList, они могут свободно изменять ArrayList, не вызывая исключение ConcurrentModificationException, если только вы не измените список одновременно (одновременно) с помощью set () методы add () или remove () класса ArrayList.

0 голосов
/ 18 сентября 2008

Итератор полезен, когда вы имеете дело с коллекциями в Java.

Используйте цикл For-Each * (Java1.5) для перебора коллекции, массива или списка.

0 голосов
/ 18 сентября 2008

Итераторы могут использоваться против любого вида коллекций. Они позволяют вам определять алгоритм для набора элементов независимо от базовой реализации. Это означает, что вы можете обрабатывать список, набор, строку, файл, массив и т. Д.

Через десять лет вы можете изменить реализацию List на лучшую реализацию, и алгоритм все равно будет работать без проблем.

0 голосов
/ 18 сентября 2008

Итераторы являются одним из многих шаблонов проектирования, доступных в Java. Шаблоны проектирования можно рассматривать как удобные строительные блоки, стили, использование вашего кода / структуры.

Чтобы узнать больше о шаблоне проектирования Iterator, посетите этот веб-сайт, на котором рассказывается об Iterator, а также о многих других шаблонах проектирования. Вот фрагмент сайта с итератором: http://www.patterndepot.com/put/8/Behavioral.html

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

0 голосов
/ 18 сентября 2008

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

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

0 голосов
/ 18 сентября 2008

Что ж, похоже, что первая точка маркера позволяет многопоточным (или однопоточным, если вы испортите) приложениям не нужно блокировать коллекцию для нарушений параллелизма. Например, в .NET вы не можете одновременно перечислять и изменять коллекцию (или список, или любой IEnumerable) без блокировки или наследования от IEnumerable и переопределяющих методов (мы получаем исключения).

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