java iterator learn use iterators java with examples
В този урок ще научим за итераторите в Java. Ще имаме подробна дискусия за интерфейсите на Iterator и ListIterator в Java:
Разгледахме всичко за Java Collection Framework и различните поддържащи интерфейси и класове в един от предишните ни уроци.
Когато имате колекция, тогава искате да осъществите достъп до нейните елементи, да добавите / премахнете или обработите елементите. За да извършите цялата тази обработка чрез програма Java, трябва да можете да преминете през колекцията, която използвате. Тук итераторът влиза в картината.
Какво ще научите:
- Какво е Java Iterator?
- Заключение
Какво е Java Iterator?
В Java итераторът е конструкция, която се използва за преминаване или преминаване през колекцията.
За да използвате итератор, трябва да вземете обекта на итератор, използвайки „ итератор () ” метод на интерфейса за събиране. Java Iterator е интерфейс на рамка за събиране и е част от пакета “java.util”. С помощта на Java Iterator можете да итерирате през колекцията от обекти.
Интерфейсът на Java Iterator замества изброителя, който е бил използван по-рано за преминаване през някои прости колекции като вектори.
Основните разлики между Java Iterator и Enumerator са:
- Значително подобрение в имената на методите.
- Можете да премахнете елементи от метода от колекцията, която се обхожда с помощта на итератор.
В този урок ще обсъдим подробностите за интерфейса на Iterator и интерфейса ListIterator, който е двупосочен интерфейс.
Типове итератори
- Изброител
- Итератор
- ListIterator
В момента рядко се използва изброител. Следователно в нашата поредица от уроци ще се съсредоточим върху интерфейсите на Iterator и ListIterator.
Интерфейс на итератор в Java
Интерфейсът на Iterator в Java е част от рамката Collections в пакета ‘java.util’ и е курсор, който може да се използва за преминаване през колекцията от обекти.
Интерфейсът Iterator има следните основни характеристики:
- Интерфейсът Iterator е достъпен от рамката за събиране на Java 1.2 нататък.
- Той обхожда колекцията от обекти един по един.
- Популярно известен като „Universal Java Cursor“, тъй като работи с всички колекции.
- Този интерфейс поддържа операции за четене и премахване, т.е. можете да премахнете елемент по време на итерация с помощта на итератора.
Общо представяне на интерфейса на итератора е дадено по-долу:
След това нека да разгледаме изброените по-горе методи на Итератор.
Методи на итератор
Интерфейсът на Iterator поддържа следните методи:
# 1) Напред ()
Прототип: E следващ ()
Параметри: няма параметри
Тип връщане: E -> element
Описание: Връща следващия елемент в колекцията.
Ако итерацията (колекцията) няма повече елементи, тя хвърля NoSuchElementException .
# 2) hasNext ()
Прототип: логически hasNext ()
Параметри: НИЛ
Тип връщане: true => в колекцията има елементи.
False => няма повече елементи
Описание: Функцията hasNext () проверява дали има повече елементи в колекцията, до която се осъществява достъп с помощта на итератор. Ако няма повече елементи, тогава не извиквате метода next (). С други думи, тази функция може да се използва, за да реши дали да се извика методът next ().
# 3) премахване ()
Прототип: премахване на празнотата ()
Параметри: НИЛ
Тип връщане: НИЛ
Описание: Премахва последния елемент, върнат от итератора, итериращ се върху основната колекция. Методът remove () може да бъде извикан само веднъж на следващо () повикване.
Ако итераторът не поддържа операция за премахване, той хвърля UnSupportedOperationException . Хвърля IllegalStateException ако следващият метод все още не е извикан.
# 4) forEachRemaining ()
Прототип: void forEachRemaining (потребител super Е > действие)
Параметри: действие => действие, което трябва да се извърши
Тип връщане: нищожен
Описание: Извършва посоченото действие върху всеки от останалите елементи на колекцията, докато всички елементи бъдат изчерпани или действието изведе изключение. Изключенията, изхвърлени от действие, се разпространяват към повикващия.
Ако действието е нула, то се повишава nullPointerException . Тази функция е ново допълнение към интерфейса на Iterator в Java 8.
Пример за Java Iterator
Нека приложим Java програма, за да демонстрираме използването на интерфейса Iterator. Следващата програма създава ArrayList от цветя. След това получава итератор, използвайки метода iterator () на ArrayList. След това списъкът се обхожда, за да покаже всеки елемент.
import java.util.*; public class Main { public static void main(String() args) { List flowers = new ArrayList(); flowers.add('Rose'); flowers.add('Jasmine'); flowers.add('sunflower'); // Get Iterator IteratorflowersIterator = flowers.iterator(); System.out.println('Contents of ArrayList:'); // Traverse elements using iterator while(flowersIterator.hasNext()){ System.out.print(flowersIterator.next() + ' '); } } }
Изход:
Ограничения на интерфейса на итератора
- Операцията за заместване на елемент или добавяне на нов елемент не може да се извърши с този итератор.
- Итерацията продължава само в една посока, т.е.посока напред.
- Поддържа само последователна итерация.
- Когато трябва да се повторят големи обеми от данни, това ще повлияе на производителността на Итератора.
Итератор VsИтерируемо
Въпреки че интерфейсите Iterable и Iterator звучат сходно, те са напълно различни. Клас, който реализира интерфейса Iterable, придобива способността да итерира върху обектите на класа, които използват интерфейса на итератора.
По-долу са дадени някои от основните разлики между тези два интерфейса, които трябва да знаете:
Итерируем интерфейс | Интерфейс на итератор |
---|---|
Представлява колекция, която може да бъде обходена с помощта на цикъл foreach. | Позволява да се итерира над друга колекция. |
Класът, който реализира итерируемия интерфейс, трябва да замени метода iterator (). | hasNext () и next () методите на интерфейса на Iterator трябва да бъдат заменени от клас, който го изпълнява. |
Не съхранява текущото състояние. | Съхранява текущото състояние на итерация. |
Екземпляр на интерфейса на итератора трябва да се създава всеки път, когато се извика методът на итератор (). | Няма такъв договор за интерфейс на итератор. |
Движи се само в посока напред. | Придвижва се в посока напред и подинтерфейсите като listIterator поддържат двупосочно обхождане. |
Не предоставя метод за промяна на елементите по време на итерация. | Предоставя метод за премахване, който може да премахне елемент, когато итерацията е в ход. |
ListIterator интерфейс в Java
Интерфейсът ListIterator е подинтерфейс на интерфейса на итератора. Работи върху колекции от типове списъци като Linkedlists, списъци с масиви и др. По този начин този интерфейс преодолява недостатъците на интерфейса Iterator.
Основните характеристики на интерфейса ListIterator включват:
- Интерфейсът ListIterator разширява интерфейса Iterator.
- ListIterator интерфейсът поддържа CRUD операции, т.е.създаване, четене, актуализиране и изтриване.
- Поддържа итерация в посока напред, както и назад.
- Тъй като този интерфейс е двупосочен, курсорът винаги е позициониран между предишния и следващия елемент.
- Този интерфейс работи главно за изпълнение на списъци като ArrayList, LinkedList и др.
- Предлага се от Java 1.2
Интерфейсът ListIterator е представен, както е показано по-долу:
Както вече споменахме, интерфейсът ListIterator разширява интерфейса Iterator. По този начин, освен че поддържа всички методи на интерфейс на итератор, както е показано по-горе, интерфейсът ListIterator има и собствени методи, които му помагат да изпълнява CRUD операции, както и двупосочна итерация.
Нека обсъдим подробно методите ListIterator.
ListIterator Methods
Имайте предвид, че методите на интерфейса Iterator, next (), hasNext () и remove (), работят точно по същия начин, както интерфейса ListIterator. Следователно, ние ще пропуснем тези методи в този раздел. В допълнение към гореспоменатите методи, ListIterator има следните методи-
Предишен ()
Прототип: E предишен ()
Параметри: НИЛ
Тип връщане:
E- предишен елемент в списъка.
- 1 - ако итераторът е в началото на списъка.
Описание: Тази функция връща предишния елемент в списъка. След като се върне предишния елемент, курсорът се премества назад към следващия елемент.
hasPrevious ()
Прототип: boolean hasPrevious ()
Параметри: НИЛ
Тип връщане: true => итераторът има повече елементи, когато списъкът се обръща назад.
Описание: Тази функция проверява дали ListIterator има повече елементи в обратна посока.
предишенИндекс
Прототип: int previousIndex ()
Параметри: НИЛ
Тип връщане:
int - индекс на предишния елемент
- 1 - ако указателят е в началото на списъка.
Описание: Връща индекса на предишния елемент, който се връща от предишното () повикване.
nextIndex
Прототип: int nextIndex ()
Параметри: НИЛ
Тип връщане:
int - следващ индекс
- 1 - ако итераторът е в края на списъка.
Описание: Връща следващия индекс на елемента в списъка. Този елемент се връща чрез извикване на метод next ().
комплект()
Прототип: празен комплект (E и)
Параметри: e - елемент, който трябва да бъде заменен
Тип връщане: НИЛ
Описание: Използва се за заместване на последния елемент с дадения елемент e.
добавяне ()
Прототип: void add (E e)
Параметри: e - елемент за добавяне
Тип връщане: НИЛ
Описание: Добавя нови елементи към списъка на позиция преди тази на следващия () елемент.
Пример за итератор на списък
Сега знаем какво е ListIterator и какви са различните методи, поддържани от него. Нека да продължим и да внедрим Java програма, за да демонстрираме ListIterator.
В тази програма използвахме ArrayList. След това използваме методите ListIterator, за да обходим списъка в посока напред, както и назад и да покажем изхода.
import java.util.*; class Main { public static void main(String args()) { Listnum_list = new ArrayList(); // Add Elements to ArrayList num_list.add(1); num_list.add(3); num_list.add(5); num_list.add(7); num_list.add(9); // Creatinge a ListIterator ListIteratorlist_it = num_list.listIterator(); System.out.println('Output using forward iteration:'); while (list_it.hasNext()) System.out.print(list_it.next()+' ') ; System.out.print('
Output using backward iteration:
') ; while (list_it.hasPrevious()) System.out.print(list_it.previous()+' '); } }
Изход:
Досега обсъждахме интерфейсите, итератора и Listiterator, след това ще видим различните примери за използване на тези интерфейси за пресичане на различни колекции. Но първо, нека да разгледаме обхождането на прости масиви и след това да преминем към други колекции.
Итератор на масиви
В Java има два начина за итерация върху масивни елементи. Нека опишем начините, като използваме примери за кодове.
# 1) за цикъл
Това е най-простият начин за итерация на масив. Използваме прост цикъл for, който ще увеличава индекса с всяка итерация и ще показва съдържанието му.
import java.util.*; public class Main { public static void main(String() args) { int myArray() = {2,4,6,8,10,12,14}; int num; System.out.println('Array contents using for loop:'); for (int i = 0; i Изход:

Горната програма показва съдържанието на масива, използвайки for цикъл.
# 2) forEach цикъл
Това е вторият начин за итерация по масиви. Тук използваме специализиран цикъл for или цикъл „forEach“. Тук прелистваме масива за всеки елемент и след това показваме съдържанието.
import java.util.*; public class Main { public static void main(String() args) { int myArray() = {2,4,6,8,10,12,14}; int num; System.out.println('Array contents using for each loop:'); for (int i :myArray) { // accessing each element of array num = i; System.out.print(num + ' '); } } }
Изход:

ForEach е по-оптимизиран в сравнение с for цикъл. Той е по-кратък за въвеждане и също е по-бърз.
ArrayList Iterator
В случай, че искате да преминете през колекция ArrayList, можете да го направите, като използвате интерфейса на Iterator. Тъй като итераторът е интерфейс, не можете да го създадете директно. Вместо това можете да използвате метода на итератора () на колекцията ArrayList, за да получите итератора и след това да прекосите списъка.
Итератор на итератор ();
Пример за демонстриране на ArrayList Iterator.
import java.util.*; public class Main { public static void main(String() args) { ArrayListmyList = new ArrayList(); myList.add('Red'); myList.add('Green'); myList.add('Blue'); myList.add('Brown'); myList.add('Pink'); myList.add('Purple'); Iteratorlist_it = myList.iterator(); System.out.println('Elements in the arrayList:'); while(list_it.hasNext()) System.out.print(list_it.next() + ' '); } }
Изход:

LinkedList Iterator
Сега нека видим функционалността на итератор в случай на колекция LinkedList.
Колекцията LinkedList поддържа метода listIterator (), който връща listIterator да премине през свързания списък.
Общият формат за тази функция е
ListIterator list_iter = LinkedList.listIterator(int index);
Тук индексът е целочислена стойност, която указва позицията в колекцията на свързания списък, откъдето трябва да започне обхождането.
Нека разберем итератора на списъка в свързания списък с примерна програма. Променихме същата програма за итератори на масиви и я променихме, за да съдържа списъчен списък с LinkedList.
import java.util.*; public class Main { public static void main(String() args) { LinkedListmyList = new LinkedList(); myList.add('Red'); myList.add('Green'); myList.add('Blue'); myList.add('Brown'); myList.add('Pink'); myList.add('Purple'); ListIteratorlist_it = myList.listIterator(0); System.out.println('Elements in the LinkedList:'); while(list_it.hasNext()) System.out.print(list_it.next() + ' '); } }
Изход:
въпроси и отговори за поведенческо интервю за тестване на софтуер

Java Map / Hashmap Iterator
Картата или нейните варианти като hashmap, treemap и т.н. не са колекции. Следователно не можете директно да използвате метода на итератора върху него. Вместо това трябва да прегледате стойностите за въвеждане на ключ, за да прочетете двойките ключ / стойност.
Въпреки че можете да използвате различни методи като forEach, for loop и т.н., за да прегледате стойностите на картата, използването на итератор за прелитане през ключовите стойности е най-добрият и ефективен метод. Освен това можете да премахнете записи от картата по време на итерация, като използвате метода за премахване.
Пример за използване на Iterator с HashMap.
import java.util.*; class Main { public static void main(String() arg) { MapmyMap = new HashMap(); // enter name/url pair myMap.put(1, 'India'); myMap.put(2, 'Nepal'); myMap.put(3, 'Maldives'); myMap.put(4, 'SriLanka'); System.out.println(' SAARC Member Countries '); System.out.println(' KEY' + ' ' + ' COUNTRY' ); // using iterators Iteratormap_itr = myMap.entrySet().iterator(); while(map_itr.hasNext()) { Map.Entrymap_entry = map_itr.next(); System.out.println(' ' + map_entry.getKey() + ' ' + map_entry.getValue()); } } }
Изход:

В горната програма дефинирахме карта с целочислени ключове и стойности от типа низ. След това дефинираме итератор върху картата. Въведете и покажете двойките ключ / стойност.
Java Set Iterator
Методът iterator () на Java.util.set се използва за получаване на итератора, който връща елементите в набора в произволен ред.
Iterator set_iterator = Set.iterator();
“Set_iterator” прелиства различните елементи на набора и връща техните стойности.
По подобен начин хеш-наборът съдържа и итераторна функция, която връща итератор като итератор на набор.
Iterator hashset_iterator = Hash_Set.iterator();
По-долу е даден пример за програмиране за демонстриране на зададения итератор.
import java.util.*; public class Main { public static void main(String args()) { HashSetsports_set = new HashSet(); sports_set.add('Hocky'); sports_set.add('Kabaddi'); sports_set.add('Football'); sports_set.add('Badminton'); sports_set.add('Cricket'); System.out.println('Sports HashSet: ' + sports_set); // Creating an iterator Iterator hashset_iter = sports_set.iterator(); // Displaying the values after iterating through the set System.out.println('
SportsSet iterator values:'); while (hashset_iter.hasNext()) { System.out.println(hashset_iter.next()); } } }
Изход:

Това изпълнение използва HashSet итератор и показва отделни стойности чрез итерация над елементите HashSet.
Iterator срещу ListIterator
Нека да обобщим основните разлики между интерфейсите на Iterator и ListIterator.
Итератор ListIterator Може да прекоси всички колекции, включително набор, карта и т.н. Може да се използва за обхождане само на колекция от типове списъци като ArrayList, LinkedList. Взаимодейства колекцията само в посока напред. Може да прелиства колекцията в посока напред, както и назад. Не могат да се получат индекси. Може да получи индекси. Няма начин да добавите нови елементи към колекцията. Можете да добавяте нови елементи към колекцията. Итераторът не може да променя елементите по време на итерация. ListIterator може да модифицира елементите в колекцията, използвайки метода set ().
често задавани въпроси
В # 1) Какво представлява итерацията в Java?
Отговор: Итерацията е процес, при който кодов блок се изпълнява многократно, докато дадено условие не се изпълни или не съществува. Използвайки итерация, можете да преминете през поредица от елементи или да обработите данните.
В # 2) Колко вида итератори има в Java?
Отговор: Итераторите се използват за обхождане на колекциите в Java.
Има три типа итератори в Java:
- Изброители
- Итератори
- ListIterators
В # 3) Как да използвам итератор в Java?
Отговор: За да използвате итератора за преминаване през колекцията, първо трябва да получите итератора, използвайки метода iterator () на посочената колекция.
След това можете да използвате методите hasNext () и next () на итератора, за да получите елемента.
В # 4) Защо Iterator се използва вместо за цикъл?
Отговор: И итераторът, и цикълът for се използват за многократно изпълнение на определен код. Но основната разлика е, че в цикъл for не можете да променяте или модифицирате съдържанието на колекцията. Дори ако се опитате да го модифицирате, той ще хвърли concurrentModificationException. С помощта на итератор можете да премахнете елемент от колекцията.
В # 5) Защо се нуждаем от Iterator в Java?
Отговор: Iterator ви помага да извлечете елементите в колекцията или контейнера, без програмистът да трябва да знае вътрешната структура или работата на колекцията. Те са по-елегантни, консумират по-малко памет, а освен това програмистът е пощаден да пише дълъг код.
На второ място, елементите могат да се съхраняват в колекцията по всякакъв начин, но използвайки итератор, програмистът може да ги извлича точно като списък или друга последователност.
Заключение
Обсъдихме итераторите в Java, които се използват с колекции в този урок. Това познание на итераторите ще помогне на читателите да разберат колекциите, които ще научим в следващите ни уроци.
Препоръчително четене
- Урок за интерфейс на Java и абстрактен клас с примери
- Урок за JAVA за начинаещи: 100+ практически ръководства за Java видео
- Разполагане на Java: Създаване и изпълнение на Java JAR файл
- Java 'this' Ключова дума: Урок с примери за кодове
- Java виртуална машина: Как JVM помага при стартирането на Java приложение
- Модификатори на достъп в Java - Урок с примери
- Урок за отражение на Java с примери
- C ++ срещу Java: Топ 30 разлики между C ++ и Java с примери