Kursor Java to iterator używany do iteracji, przechodzenia lub pobierania elementów obiektu Collection lub Stream, jeden po drugim. W tym artykule dowiemy się o iteratorach Java i to działa.
Rodzaje kursorów w Javie
Tam są trzy kursory w Javie, jak wspomniano poniżej:
- Iterator
- Wyliczenie
- ListIterator
Notatka: SplitIterator można również uznać za kursor, ponieważ jest to tylko typ Iteratora.
1. Iterator
Iteratory w Javie są używane w Ramy kolekcji aby pobierać elementy jeden po drugim. To jest uniwersalny iterator, ponieważ możemy zastosować go do dowolnego obiektu kolekcji. Korzystając z Iteratora, możemy wykonywać zarówno operacje odczytu, jak i usunięcia. Jest to ulepszona wersja Enumeration z dodatkową funkcjonalnością usuwania elementu.
Iteratora należy używać zawsze, gdy chcemy wyliczyć elementy we wszystkich interfejsach zaimplementowanych w ramach Collection, takich jak Set, List, Queue, Deque i wszystkich zaimplementowanych klasach interfejsu Map. Iterator to tylko kursor dostępny dla całego środowiska kolekcji. Obiekt iteratora można utworzyć, wywołując metodę iterator() metoda obecna w interfejsie Kolekcji.
Składnia
Iterator itr = c. iterator ();>
Notatka: Tutaj c jest dowolnym obiektem kolekcji. itr jest typu Interfejs Iteratora i odnosi się do c.
aplet
Metody interfejsu iteratora w Javie
Interfejs iteratora definiuje trzy metody wymienione poniżej:
1. maNastępny(): Zwraca wartość true, jeśli iteracja zawiera więcej elementów.
public boolean hasNext();>
2. następny(): Zwraca następny element w iteracji. Rzuca Wyjątek NoSuchElement jeśli nie ma już więcej elementów.
public Object next();>
3. usuń(): Usuwa następny element w iteracji. Metodę tę można wywołać tylko raz na wywołanie metody next().
public void remove();>
Notatka: usunąć() metoda może zgłosić dwa wyjątki, a mianowicie:
- Nieobsługiwany wyjątek operacji : Jeśli operacja usuwania nie jest obsługiwana przez ten iterator
- Wyjątek IllegalStateException : Jeśli następna metoda nie została jeszcze wywołana lub metoda usuwania została już wywołana po ostatnim wywołaniu kolejnej metody.
Jak działa wewnętrznie iterator Java?
W tej sekcji postaramy się zrozumieć, jak wewnętrznie działa Java Iterator i jego metody. Aby zrozumieć tę funkcjonalność, weźmy następujący obiekt LinkedList.
List cities = new LinkedList(); cities.add('G-1'); cities.add('G-2'); cities.add('G-3'); . . . cities.add('G-n');>Teraz utwórzmy obiekt Iterator na obiekcie List, jak pokazano poniżej:
Iterator citiesIterator = cities.iterator();>
Iterator cityIteartor będzie wyglądał następująco –
Tutaj Kursor Iteratora wskazuje przed pierwszym elementem Listy.
Teraz uruchomimy następujący fragment kodu.
citiesIterator.hasNext(); citiesIterator.next();>
Kiedy uruchomimy powyższy fragment kodu, Kursor Iteratora wskazuje pierwszy element na liście, jak pokazano na powyższym diagramie.
potrójna zima
Teraz uruchomimy następujący fragment kodu.
citiesIterator.hasNext(); citiesIterator.next();>
Kiedy uruchomimy powyższy fragment kodu, Kursor Iteratora wskazuje drugi element na liście, jak pokazano na powyższym diagramie. Wykonaj ten proces, aby dotrzeć kursorem iteratora do końcowego elementu listy.
Jeśli po przeczytaniu ostatniego elementu uruchomimy poniższy fragment kodu, zwróci on wartość fałszywą.
citiesIterator.hasNext();>

Ponieważ Kursor Iteratora wskazuje na ostatni element listy, metoda hasNext() zwraca wartość fałszywą.
Notatka: Po obejrzeniu wszystkich tych diagramów możemy powiedzieć, że Iterator Java obsługuje tylko iterację w kierunku do przodu, jak pokazano na poniższym diagramie. Dlatego jest również znany jako kursor jednokierunkowy.

Przykład
Jawa // Java program to Demonstrate Iterator // Importing ArrayList and Iterator classes // from java.util package import java.util.ArrayList; import java.util.Iterator; // Main class public class Test { // Main driver method public static void main(String[] args) { // Creating an ArrayList class object // Declaring object of integer type ArrayList al = nowa lista tablic (); // Iteracja po liście dla (int i = 0; i< 10; i++) al.add(i); // Printing the elements in the List System.out.println(al); // At the beginning itr(cursor) will point to // index just before the first element in al Iterator itr = al.iterator(); // Sprawdzanie następnego elementu, gdzie // warunek jest spełniony, dopóki na liście // nie znajdzie się pojedynczy element, przy użyciu metody hasext() while (itr.hasNext()) { // Przesunięcie kursora do następnego elementu int i = itr.next( ); // Pobieranie elementów jeden po drugim System.out.print(i + ' '); // Usuwanie nieparzystych elementów if (i % 2 != 0) itr.remove(); } // Polecenie dla następnego wiersza System.out.println(); // Drukowanie elementów wewnątrz obiektu System.out.println(al); } }> Wyjście
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 0 1 2 3 4 5 6 7 8 9 [0, 2, 4, 6, 8]>
SplitIterator
Spliteratory, podobnie jak inne iteratory, służą do przechodzenia przez elementy źródła. Źródłem może być A Kolekcja , kanał IO lub funkcję generatora. Jest zawarty w JDK 8 w celu obsługi wydajnego przechodzenia równoległego (programowanie równoległe) oprócz przechodzenia sekwencyjnego. Interfejs Java Spliterator to wewnętrzny iterator, który dzieli strumień na mniejsze części. Te mniejsze części można przetwarzać równolegle.
Notatka: W prawdziwym programowaniu być może nigdy nie będziemy musieli bezpośrednio używać Spliteratora. W normalnych operacjach będzie zachowywał się dokładnie tak samo jak Iterator Java.
Zalety iteratora Java
- Możemy go użyć do dowolnej klasy Kolekcji.
- Obsługuje zarówno operacje CZYTAJ, jak i USUŃ.
- Jest to uniwersalny kursor dla API kolekcji.
- Nazwy metod są proste i łatwe w użyciu.
Ograniczenia iteratora Java
Istnieją również pewne ograniczenia Iteratora, które są wymienione w następujący sposób:
- W operacjach CRUD NIE obsługuje operacji CREATE i UPDATE.
- Obsługuje tylko iterację w kierunku do przodu, która jest iteratorem jednokierunkowym.
- W porównaniu do Spliteratora, NIE obsługuje iteracji elementów równolegle, co oznacza, że obsługuje tylko iterację sekwencyjną.
- W porównaniu do Spliteratora NIE zapewnia lepszej wydajności w przypadku iteracji dużych ilości danych.
2. Wyliczenie
Jest to interfejs służący do pobierania elementów starszych kolekcji (Vector, Hashtable). Wyliczenie jest pierwszym iteratorem obecnym w JDK 1.0, reszty są zawarte w JDK 1.2 z większą funkcjonalnością. Wyliczenia służą również do określania strumieni wejściowych do a Sekwencyjny strumień wejściowy . Możemy utworzyć obiekt Enumeration wywołując metodę elementy() metoda klasy wektorowej na dowolnym obiekcie wektorowym
Składnia
// Here 'v' is an Vector class object. e is of // type Enumeration interface and refers to 'v' Enumeration e = v . elements ();>
Tam są dwa metody w interfejsie Enumeration, a mianowicie:
1. publiczna wartość logiczna hasMoreElements(): Ta metoda sprawdza, czy to wyliczenie zawiera więcej elementów, czy nie.
2. Obiekt publiczny nextElement(): Ta metoda zwraca następny element tego wyliczenia. Zgłasza wyjątek NoSuchElementException, jeśli nie ma więcej elementów
Przykład
Jawa // Java program to demonstrate Enumeration // Importing Enumeration and Vector classes // from java.util package import java.util.Enumeration; import java.util.Vector; // Main class public class Test { // Main driver method public static void main(String[] args) { // Creating a vector object Vector v = new Vector(); // Iterating over vector object for (int i = 0; i < 10; i++) v.addElement(i); // Printing elements in vector object System.out.println(v); // At beginning e(cursor) will point to // index just before the first element in v Enumeration e = v.elements(); // Checking the next element availability where // condition holds true till there is a single // element // remaining in the List while (e.hasMoreElements()) { // Moving cursor to next element int i = (Integer)e.nextElement(); // Print above elements in object System.out.print(i + ' '); } } }> Wyjście
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 0 1 2 3 4 5 6 7 8 9>
Istnieją pewne ograniczenia wyliczania, które są następujące:
- Wyliczenie jest dla dziedzictwo tylko klasy (Vector, Hashtable). Dlatego nie jest to iterator uniwersalny.
- Operacji usuwania nie można wykonać przy użyciu wyliczenia.
- Możliwa jest tylko iteracja w kierunku do przodu.
Podobieństwa między wyliczeniem Java a iteratorem
- Obydwa są kursorami Java.
- Obydwa służą do iteracji kolekcji elementów obiektu jeden po drugim.
- Obydwa obsługują operację ODCZYTU lub pobierania.
- Obydwa są jednokierunkowymi kursorami Java, co oznacza, że obsługują tylko iterację w kierunku do przodu.
Różnice między wyliczeniem Java a iteratorem
Poniższa tabela opisuje różnice między wyliczeniem Java a iteratorem:
| Wyliczenie | Iterator |
|---|---|
| Wprowadzono w Javie 1.0 | Wprowadzono w Javie 1.2 |
| Starszy interfejs | Nie starszy interfejs |
| Służy do iteracji tylko klas Legacy Collection. | Możemy go użyć do dowolnej klasy Kolekcji. |
| Obsługuje tylko operację ODCZYTU. | Obsługuje zarówno operacje CZYTAJ, jak i USUŃ. |
| To nie jest kursor uniwersalny. | Jest to kursor uniwersalny. |
| Długie nazwy metod. | Proste i łatwe w użyciu nazwy metod. |
3. ListIterator
Ma zastosowanie tylko do klas zaimplementowanych w kolekcji List, takich jak ArrayList, LinkedList itp. Zapewnia dwukierunkową iterację. ListIterator musi zostać użyty, gdy chcemy wyliczyć elementy Listy. Ten kursor ma więcej funkcjonalności (metod) niż iterator. Obiekt ListIterator można utworzyć poprzez wywołanie listaIterator() metoda obecna w interfejsie List.
Składnia
ListIterator ltr = l. listIterator ();>
Notatka: Tutaj l jest dowolnym obiektem List, ltr jest typem. Interfejs ListIterator i odnosi się do l. Interfejs ListIterator rozszerza interfejs Iteratora. Zatem wszystkie trzy metody interfejsu Iteratora są dostępne dla ListIterator. Ponadto istnieją sześć więcej metod.
1. Kierunek do przodu
1.1 maNastępny(): Zwraca wartość true, jeśli iteracja zawiera więcej elementów
public boolean hasNext();>1.2 następny(): To samo co metoda next() Iteratora. Zwraca następny element w iteracji.
public Object next();>1.3 następnyIndeks(): Zwraca indeks następnego elementu lub rozmiar listy, jeśli iterator listy znajduje się na końcu listy.
public int nextIndex();>
2. Kierunek wstecz
2.1 maPoprzedni(): Zwraca wartość true, jeśli iteracja zawiera więcej elementów podczas przechodzenia wstecz.
public boolean hasPrevious();>2.2 poprzedni(): Zwraca poprzedni element w iteracji i może rzucić Wyjątek NoSuchElement jeśli nie ma już więcej elementów.
public Object previous();>2.3 poprzedniIndeks(): Zwraca indeks poprzedniego elementu lub -1 jeśli iterator listy znajduje się na początku listy,
sortowanie listy tablic Javapublic int previousIndex();>
3. Inne metody
3.1 usuń(): To samo co metoda usuwania() Iteratora. Usuwa następny element w iteracji.
public void remove();>Zestaw 3.2 (obiekt obiektu): Zastępuje ostatni element zwrócony przez next() lub poprzedni() określonym elementem.
public void set(Object obj);>3.3 dodaj (obiekt obiektu): Wstawia określony element na listę na pozycji przed elementem, który zostanie zwrócony przez next()
public void add(Object obj);>
Oczywiście, trzy metody, które ListIterator dziedziczy z Iteratora ( maNastępny() , Następny() , I usunąć() ) wykonaj dokładnie to samo w obu interfejsach. The maPoprzedni() a poprzednie operacje są dokładnymi analogami maNastępny() I Następny() . Pierwsze operacje odnoszą się do elementu znajdującego się przed (niejawnym) kursorem, natomiast drugie odnoszą się do elementu za kursorem. Poprzednia operacja przesuwa kursor do tyłu, następna przesuwa go do przodu.
ListIterator nie ma bieżącego elementu; jego pozycja kursora zawsze leży pomiędzy elementem, który zostałby zwrócony przez wywołanie poprzedni() i element, który zostanie zwrócony przez wywołanie Następny().
1 zestaw() metoda może zgłosić 4 wyjątki.
- Nieobsługiwany wyjątek operacji: jeśli operacja ustawiania nie jest obsługiwana przez ten iterator listy
- Wyjątek ClassCast: Jeśli klasa określonego elementu uniemożliwia dodanie go do tej listy
- Wyjątek IllegalArgument: Jeśli jakiś aspekt określonego elementu uniemożliwia dodanie go do tej listy
- Wyjątek IllegalState: Jeśli nie zostało wywołane ani następne, ani poprzednie, albo też usuń lub dodaj nie zostały wywołane po ostatnim wywołaniu następnego lub poprzedniego
2. dodaj() metoda może zgłosić 3 wyjątki.
- Nieobsługiwany wyjątek operacji: Jeśli metoda add nie jest obsługiwana przez ten iterator listy
- Wyjątek ClassCast: Jeśli klasa określonego elementu uniemożliwia dodanie go do tej listy
- Wyjątek IllegalArgument: Jeśli jakiś aspekt tego elementu uniemożliwia dodanie go do tej listy
Przykład
Jawa // Java program to demonstrate ListIterator // Importing ArrayList and List iterator classes // from java.util package import java.util.ArrayList; import java.util.ListIterator; // Main class public class Test { // Main driver method public static void main(String[] args) { // Creating an object of ArrayList class ArrayList al = new ArrayList(); // Iterating over Arraylist object for (int i = 0; i < 10; i++) // Adding elements to the Arraylist object al.add(i); // Print and display all elements inside object // created above System.out.println(al); // At beginning ltr(cursor) will point to // index just before the first element in al ListIterator ltr = al.listIterator(); // Checking the next element availability while (ltr.hasNext()) { // Moving cursor to next element int i = (Integer)ltr.next(); // Getting even elements one by one System.out.print(i + ' '); // Changing even numbers to odd and // adding modified number again in // iterator if (i % 2 == 0) { // Change to odd i++; // Set method to change value ltr.set(i); // To add ltr.add(i); } } // Print and display statements System.out.println(); System.out.println(al); } }> Wyjście
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 0 1 2 3 4 5 6 7 8 9 [1, 1, 1, 3, 3, 3, 5, 5, 5, 7, 7, 7, 9, 9, 9]>
Notatka: Podobnie istnieją pewne ograniczenia w przypadku ListIterator . Jest to najpotężniejszy iterator, ale ma zastosowanie tylko do klas zaimplementowanych w List, więc nie jest iteratorem uniwersalnym.
Ważne punkty
- Należy pamiętać, że początkowo każde odwołanie do iteratora będzie wskazywało indeks tuż przed indeksem pierwszego elementu w kolekcji.
- Nie tworzymy obiektów Enumeration, Iterator, ListIterator, ponieważ są to interfejsy. Do tworzenia obiektów używamy metod takich jak elementy(), iterator(), listIterator(). Metody te mają charakter anonimowy Klasa wewnętrzna który rozszerza odpowiednie interfejsy i zwraca ten obiekt klasy.
Notatka: The $ symbol w nazwie klasy referencyjnej jest dowodem na to, że używana jest koncepcja klas wewnętrznych i tworzone są obiekty tych klas.
status gita
Można to sprawdzić za pomocą poniższego kodu. Więcej informacji na temat klasy wewnętrznej można znaleźć w artykule
Jawa // Java program to demonstrate iterators references // Importing required classes from java.util package import java.util.Enumeration; import java.util.Iterator; import java.util.ListIterator; import java.util.Vector; // Main class public class GFG { // Main driver method public static void main(String[] args) { // Creating an object of Vector class Vector v = new Vector(); // Creating three iterators Enumeration e = v.elements(); Iterator itr = v.iterator(); ListIterator ltr = v.listIterator(); // Print class names of iterators // using getClass() and getName() methods System.out.println(e.getClass().getName()); System.out.println(itr.getClass().getName()); System.out.println(ltr.getClass().getName()); } }> Wyjście
java.util.Vector java.util.Vector$Itr java.util.Vector$ListItr>
Wyjaśnienie
W Javie iterator to interfejs używany do przeglądania kolekcji obiektów jeden po drugim. Służy do iteracji po dowolnej strukturze danych opartej na kolekcji, w tym tablicach, listach, zestawach i mapach.
Iterator ma trzy główne metody używane do przeglądania kolekcji:
- hasNext() – Ta metoda sprawdza, czy w kolekcji znajduje się inny element, po którym można iterować.
- next() – Ta metoda zwraca następny element w kolekcji.
- Remove() – Ta metoda usuwa bieżący element z kolekcji.
Interfejs Iteratora jest częścią Java Collection Framework i jest implementowany przez klasy reprezentujące różne typy kolekcji.
Program
Jawa import java.util.ArrayList; import java.util.Iterator; public class IteratorExample { public static void main(String[] args) { ArrayListnazwy = nowa lista tablic(); nazwy.add('Alicja'); nazwy.add('Bob'); name.add('Charlie'); nazwy.add('Dawid'); // Tworzenie iteratora dla listy nazw Iteratoriterator = nazwy.iterator(); // Iteracja po liście nazw za pomocą iteratora while (iterator.hasNext()) { String name = iterator.next(); System.out.println(nazwa); } } }> Wyjście
Alice Bob Charlie David>
W tym przykładzie utworzyliśmy ArrayList ciągów znaków i dodaliśmy do niej cztery nazwy. Następnie utworzyliśmy iterator dla listy przy użyciu metody iterator() klasy ArrayList. Użyliśmy metody hasNext() do sprawdzenia, czy na liście jest więcej elementów do iteracji, oraz metody next() do pobrania kolejnego elementu na liście. Wydrukowaliśmy każdy element za pomocą metody System.out.println().
Używanie iteratora do przeglądania kolekcji jest wygodnym i wydajnym sposobem iterowania po kolekcji, ponieważ umożliwia iterację po kolekcji bez znajomości wewnętrznej struktury kolekcji. Pozwala także na usuwanie elementów z kolekcji podczas iteracji po niej.
Zalety Iteratora w Javie:
- Iterator to prosty i łatwy w użyciu interfejs, który pozwala nam przeglądać kolekcję bez ujawniania jej podstawowej implementacji.
- Iterator to skuteczny sposób na iterację kolekcji, zwłaszcza gdy mamy dużą ilość danych.
- Iterator zapewnia bezpieczny sposób usuwania elementów z kolekcji podczas iteracji, bez powodowania jakichkolwiek współbieżnych wyjątków modyfikacji.
- Interfejs Iteratora jest implementowany przez wszystkie klasy kolekcji w Javie, dzięki czemu możemy używać tego samego kodu do iteracji po różnych typach kolekcji.
Wady Iteratora w Javie:
Istnieją pewne wady używania Iteratora w Javie, jak wspomniano poniżej:
- Iterator jest interfejsem jednokierunkowym, co oznacza, że możemy poruszać się do przodu tylko po kolekcji. Nie możemy cofnąć się ani przeskoczyć do konkretnego elementu.
- Iterator nie jest bezpieczny dla wątków, dlatego nie możemy go używać do iteracji po kolekcji w środowisku wielowątkowym bez odpowiedniej synchronizacji.
- Iterator nie zapewnia żadnego mechanizmu modyfikowania elementów podczas iteracji po kolekcji, z wyjątkiem usuwania elementów. Jeśli musimy zmodyfikować elementy, musimy skorzystać z innych interfejsów, takich jak ListIterator lub prosta pętla for.