Мы часто используем итеративный интерфейс, предоставленный JDK для итерации Java Collections.
Iterator iterator = list.iterator (); while (iterator.hasnext ()) {string string = iterator.next (); // сделать что -нибудь} Итерация на самом деле может быть просто понята как обход. Это метод класс, который стандартизирует обход всех объектов в различных контейнерах. Это очень типичный дизайн. Образец итератора - это стандартный метод доступа, используемый для прохождения классов сбора. Он абстрагирует логику доступа от различных типов классов сбора, что избегает обнаружения внутренней структуры коллекции клиенту. Вот как мы справляемся с этим, когда нет итератора. следующее:
Для массивов мы используем подписки для обработки:
int [] arrays = new int [10]; for (int i = 0; i <arrays.length; i ++) {int a = arrays [i]; // что -то} Так обрабатывается ArrayList:
List <string> list = new ArrayList <string> (); for (int i = 0; i <list.size (); i ++) {string string = list.get (i); // что -то} Для обоих методов мы всегда заранее знаем внутреннюю структуру сбора. Код доступа и сама коллекция тесно связаны и не могут отделить логику доступа от класса коллекции и клиентского кода. В то же время каждая коллекция соответствует методу обхода, и код клиента не может быть использован повторно. В практических приложениях довольно трудно интегрировать два набора выше. Таким образом, чтобы решить вышеуказанные задачи, режим итератора является вакантным, и он всегда использует ту же логику для прохождения коллекции. Это делает самого клиента ненужным для поддержания внутренней структуры сбора, и все внутренние состояния поддерживаются итератором. Клиент никогда не занимается классом коллекции напрямую. Он всегда управляет итератором и посылает его «вперед», «обратно» и «взять в него команды текущего элемента», и он может косвенно пройти всю коллекцию.
Выше всего является кратким объяснением рисунка итератора. Давайте посмотрим на интерфейс итератора в Java, чтобы увидеть, как он его реализует.
1. java.util.iterator
В Java итератор - это интерфейс, который предоставляет только итеративные основные правила. В JDK это определяется как это: итератор, который итерация на коллекции. Итератор заменяет перечисление в рамках коллекций Java. Есть два различия между итераторами и перечислениями:
1. Итератор позволяет вызывающему вызыву удалять элементы из коллекции, на которую указывают итератор во время итерации с использованием четко определенной семантики.
2. Имя метода было улучшено.
Определение интерфейса заключается в следующем:
публичный интерфейс итератор {boolean hasnext (); Объект Next (); void remove ();} в:
Object Next (): возвращает ссылку на элемент, который просто пересекает итератор. Возвращаемое значение - это объект, который необходимо поднять на необходимый вам тип.
Boolean hasnext (): определяет, есть ли какие -либо элементы, доступные в контейнере для доступа
void remove (): удалить только что итератор.
Для нас нам нужно использовать только следующее () и Hasnext () для завершения итерации. следующее:
for (iterator it = c.iterator (); it.hasnext ();) {object o = it.next (); // что -то делаю} Предыдущее объяснение заключается в том, что итератор имеет большое преимущество, то есть нам не нужно знать внутренние результаты набора. Внутренняя структура и состояние набора поддерживаются итератором. Мы судим и получаем следующий элемент с помощью унифицированных методов HasNext () и Next (). Что касается конкретной внутренней реализации, нам не нужно беспокоиться об этом. Но как квалифицированный программист, очень необходимо выяснить реализацию итератора. Исходный код ArrayList анализируется ниже.
2. Реализация итератора для каждой коллекции
Давайте проанализируем реализацию итератора ArrayList. На самом деле, если мы поймем структуры данных ArrayList, Hashset и Treesset и реализуем их внутри, мы будем уверены в том, как они реализуют итератор. Поскольку внутренняя реализация ArrayList использует массив, нам нужно только записать индекс соответствующей позиции, а реализация его метода относительно проста.
2.1. Итератор реализация ArrayList
Внутри ArrayList сначала определяет внутренний класс ITR, который реализует интерфейс итератора следующим образом:
Частный класс ITR реализует итератор <e> {// что -то делать} И реализован метод итератора () ArrayList:
public iterator <e> iterator () {return new itr ();} Таким образом, метод ArrayList.iterator () возвращает внутренний класс itr (), поэтому нам нужно, чтобы ухаживать сейчас, так это реализация внутреннего класса ITR ():
Три переменные типа Int-Type определены внутри ITR: курсор, ластрит и ожидаемый модконт. где курсор представляет индексную позицию следующего элемента, а Lastret представляет собой позицию индекса предыдущего элемента
int cursor; int lastret = -1; int weddcount = modcount;
Из определений курсора и ластры можно видеть, что Lastret всегда был на один меньше курсора, поэтому метод реализации hasnext () чрезвычайно прост. Вам нужно только судить, равны ли курсор и ластер.
public boolean hasnext () {return cursor! = size;} Реализация Next () на самом деле относительно проста. Просто верните элемент в положении индекса курсора, а затем измените курсор и Lastret
public e next () {checkforComodification (); int i = cursor; // Записать положение индекса if (i> = size) // Если элемент получения больше, чем количество элементов сбора, исключение бросается, бросая новую noshelementexception (); object [] elementData = arraylist.his.elementData; if (i> = elementdata.length) бросить новый concurrentmodificationexception (); cursor = i + 1; // coursor + 1trourn (e) elementData [lastret = i]; // lastret + 1 и вернуть элемент в курсоре} CheckforComodification () в основном используется для определения того, является ли количество изменений набора законным, то есть для определения того, был ли набор изменен в течение процесса обхода. ModCount используется для записи количества модификаций коллекции ArrayList, инициализируемой до 0, и всякий раз, когда коллекция модифицируется один раз (внутреннее обновление не учитывается для структуры), например, добавление, удаление и другие методы, ModCount + 1, поэтому, если ModCount остается неизменным, это означает, что содержание коллекции не модифицировано. Этот механизм в основном используется для реализации механизма быстрого сбоя коллекции ArrayList. В коллекциях Java большая часть коллекций имеет механизм быстрых отказа. Я не буду говорить об этом здесь, и я расскажу об этом позже. Следовательно, чтобы убедиться, что нет ошибок в процессе обхода, мы должны убедиться, что не будет структурных модификаций в сборе во время процесса обхода (за исключением метода удаления). Если возникает ошибка исключения, мы должны тщательно проверить, есть ли у программы ошибка вместо того, чтобы не обрабатывать ее после улова.
final void checkforComodification () {if (modcount! = wedermodcount) добавить новый complourentmodificationexception ();} Метод remove () - это реализация, которая вызывает метод remove () самого ArrayList для удаления элемента позиции Lastret, а затем изменить ModCount.
public void remove () {if (lastret <0) throw new allogalStateException (); checkforComodification (); try {arraylist.tis.remove (lastret); cursor = lastret; lastret = -1; weadmodcount = modcount;} catch (indexoutofboundsexception ex)Выше приведено метод реализации итераторной итераторной итераторной итератора Java, представленной вам редактором. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!