Kazalec Java je iterator, ki se uporablja za ponavljanje ali prečkanje ali pridobivanje elementov objekta Collection ali Stream enega za drugim. V tem članku bomo spoznali iteratorje Java in njihovo delovanje.
Vrste kazalcev v Javi
obstajajo trije kazalci v Javi, kot je navedeno spodaj:
- Iterator
- Naštevanje
- ListIterator
Opomba: SplitIterator lahko obravnavamo tudi kot kazalec, saj je samo vrsta iteratorja.
1. Iterator
Iteratorji v Javi se uporabljajo v Ogrodje zbirke za pridobivanje elementov enega za drugim. Je univerzalni iterator, saj ga lahko uporabimo za kateri koli predmet zbirke. Z uporabo Iteratorja lahko izvajamo operacije branja in odstranjevanja. Je izboljšana različica Enumeration z dodatno funkcijo odstranjevanja elementa.
Iterator je treba uporabiti vedno, ko želimo oštevilčiti elemente v vseh implementiranih vmesnikih ogrodja zbirke, kot so Set, List, Queue, Deque, in vsi implementirani razredi vmesnika Map. Iterator je samo kazalec, ki je na voljo za celotno ogrodje zbirke. Objekt iteratorja lahko ustvarite s klicem iterator() metoda, ki je prisotna v vmesniku zbirke.
Sintaksa
Iterator itr = c. iterator ();>
Opomba: Tukaj je c kateri koli predmet zbirke. itr je vmesnik Iterator tipa in se nanaša na c.
normalne oblike
Metode vmesnika iteratorja v Javi
Vmesnik iteratorja definira tri metode, kot so navedene spodaj:
1. hasNext(): Vrne true, če ima ponovitev več elementov.
public boolean hasNext();>
2. naslednji(): Vrne naslednji element v ponovitvi. Vrže NoSuchElementException če ni prisotnega več elementa.
public Object next();>
3. odstrani(): Odstrani naslednji element v ponovitvi. To metodo lahko pokličete samo enkrat na klic next().
public void remove();>
Opomba: Odstrani() metoda lahko povzroči dve izjemi, in sicer kot sledi:
- UnsupportedOperationException : Če ta iterator ne podpira operacije odstranitve
- IllegalStateException : Če naslednja metoda še ni bila poklicana ali pa je bila metoda za odstranitev že klicana po zadnjem klicu naslednje metode.
Kako Java Iterator deluje interno?
V tem razdelku bomo poskušali razumeti, kako Java Iterator in njegove metode delujejo interno. Za razumevanje te funkcije vzemimo naslednji objekt LinkedList.
List cities = new LinkedList(); cities.add('G-1'); cities.add('G-2'); cities.add('G-3'); . . . cities.add('G-n');>Zdaj pa ustvarimo objekt Iterator na objektu List, kot je prikazano spodaj:
Iterator citiesIterator = cities.iterator();>
Iterator citiesIteartor bo videti takole –
Tukaj iteratorjev kazalec kaže pred prvim elementom seznama.
Zdaj bomo zagnali naslednji delček kode.
citiesIterator.hasNext(); citiesIterator.next();>
Ko zaženemo zgornji delček kode, iteratorjev kazalec kaže na prvi element na seznamu, kot je prikazano v zgornjem diagramu.
Zdaj bomo zagnali naslednji delček kode.
citiesIterator.hasNext(); citiesIterator.next();>
Ko zaženemo zgornji delček kode, iteratorjev kazalec kaže na drugi element na seznamu, kot je prikazano v zgornjem diagramu. Izvedite ta postopek, da dosežete kazalec iteratorja do končnega elementa seznama.
Če po branju končnega elementa zaženemo spodnji delček kode, ta vrne napačno vrednost.
prenos medijev
citiesIterator.hasNext();>

Ko kazalec iteratorja kaže na za končnim elementom seznama, metoda hasNext() vrne napačno vrednost.
Opomba: Po opazovanju vseh teh diagramov lahko rečemo, da Java Iterator podpira samo iteracijo v smeri naprej, kot je prikazano v spodnjem diagramu. Zato je znan tudi kot enosmerni kazalec.

Primer
Java // 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 = nov ArrayList (); // Ponavljanje po seznamu za (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(); // Preverjanje naslednjega elementa, kjer // pogoj velja, dokler na seznamu // ni enega samega elementa z uporabo metode hasnext() while (itr.hasNext()) { // Premikanje kazalca na naslednji element int i = itr.next( ); // Pridobivanje elementov enega za drugim System.out.print(i + ' '); // Odstranjevanje lihih elementov if (i % 2 != 0) itr.remove(); } // Ukaz za naslednjo vrstico System.out.println(); // Tiskanje elementov znotraj objekta System.out.println(al); } }> Izhod
[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
Razdelilniki so tako kot drugi iteratorji namenjeni prečkanju elementov vira. Vir je lahko a Zbirka , kanal IO ali funkcija generatorja. Vključen je v JDK 8 za podporo učinkovitemu vzporednemu prehodu (vzporednemu programiranju) poleg zaporednega prehoda. Vmesnik Java Spliterator je notranji iterator, ki razdeli tok na manjše dele. Te manjše dele je mogoče obdelovati vzporedno.
Opomba: Pri programiranju v resničnem življenju morda nikoli ne bomo morali uporabiti Spliteratorja neposredno. Pri normalnem delovanju se bo obnašal popolnoma enako kot Java Iterator.
Prednosti Java Iteratorja
- Uporabimo ga lahko za kateri koli razred zbirke.
- Podpira operacije READ in REMOVE.
- Je API za univerzalni kazalec za zbiranje.
- Imena metod so preprosta in enostavna za uporabo.
Omejitve Java Iteratorja
Obstajajo tudi nekatere omejitve Iteratorja, ki so navedene na naslednji način:
- V operacijah CRUD NE podpira operacij CREATE in UPDATE.
- Podpira samo iteracijo v smeri naprej, ki je enosmerni iterator.
- V primerjavi s Spliteratorjem NE podpira vzporednega ponavljanja elementov, kar pomeni, da podpira samo zaporedno ponavljanje.
- V primerjavi s Spliteratorjem NE podpira boljše zmogljivosti za ponavljanje velikih količin podatkov.
2. Naštevanje
Je vmesnik, ki se uporablja za pridobivanje elementov starejših zbirk (vektor, hashtable). Enumeracija je prvi iterator, ki je prisoten iz JDK 1.0, ostali so vključeni v JDK 1.2 z več funkcionalnosti. Naštevanja se uporabljajo tudi za določanje vhodnih tokov za a SequenceInputStream . Objekt Enumeration lahko ustvarimo s klicem elementi () metoda vektorskega razreda na katerem koli vektorskem objektu
Sintaksa
// Here 'v' is an Vector class object. e is of // type Enumeration interface and refers to 'v' Enumeration e = v . elements ();>
obstajajo dva metode v vmesniku za naštevanje, in sicer:
1. javna logična vrednost hasMoreElements(): Ta metoda preizkusi, ali to oštevilčenje vsebuje več elementov ali ne.
2. javni objekt nextElement(): Ta metoda vrne naslednji element tega oštevilčenja. Vrže NoSuchElementException, če ni prisotnega več elementa
Primer
Java // 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 + ' '); } } }> Izhod
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 0 1 2 3 4 5 6 7 8 9>
Obstajajo določene omejitve pri naštevanju, ki so naslednje:
- Naštevanje je za zapuščina samo razredi (vektor, zgoščena tabela). Zato ni univerzalni iterator.
- Operacij odstranjevanja ni mogoče izvesti z uporabo naštevanja.
- Možno je samo ponavljanje v smeri naprej.
Podobnosti med Java Enumeration in Iterator
- Oba sta kazalca Java.
- Oba se uporabljata za ponavljanje zbirke elementov objekta enega za drugim.
- Oba podpirata operacijo READ ali Retrieval.
- Oba sta enosmerna kazalca Java, kar pomeni, da podpirata samo iteracijo v smeri naprej.
Razlike med Java Enumeration in Iterator
Naslednja tabela opisuje razlike med Java Enumeration in Iterator:
| Naštevanje | Iterator |
|---|---|
| Predstavljeno v Javi 1.0 | Predstavljeno v Javi 1.2 |
| Podedovan vmesnik | Ni podedovan vmesnik |
| Uporablja se samo za ponavljanje razredov Legacy Collection. | Uporabimo ga lahko za kateri koli razred zbirke. |
| Podpira samo operacijo READ. | Podpira operacije READ in DELETE. |
| To ni univerzalni kazalec. | Je univerzalni kazalec. |
| Dolga imena metod. | Enostavna in za uporabo enostavna imena metod. |
3. ListIterator
Uporablja se samo za implementirane razrede zbirke List, kot so ArrayList, LinkedList itd. Zagotavlja dvosmerno ponavljanje. ListIterator je treba uporabiti, ko želimo oštevilčiti elemente seznama. Ta kazalec ima več funkcij (metod) kot iterator. Objekt ListIterator je mogoče ustvariti s klicem listIterator() metoda, ki je prisotna v vmesniku List.
Sintaksa
ListIterator ltr = l. listIterator ();>
Opomba: Tukaj je l poljuben objekt seznama, ltr je vrste. ListIterator vmesnik in se nanaša na l. Vmesnik ListIterator razširja vmesnik Iterator. Tako so za ListIterator na voljo vse tri metode vmesnika Iterator. Poleg tega obstajajo šest več metod.
1. Smer naprej
1.1 hasNext(): Vrne true, če ima ponovitev več elementov
public boolean hasNext();>1.2 naslednji(): Enako kot metoda next() Iteratorja. Vrne naslednji element v ponovitvi.
public Object next();>1.3 nextIndex(): Vrne naslednji indeks elementa ali velikost seznama, če je iterator seznama na koncu seznama.
public int nextIndex();>
2. Smer nazaj
2.1 hasPrevious(): Vrne true, če ima ponovitev med premikanjem nazaj več elementov.
public boolean hasPrevious();>2.2 prejšnji (): Vrne prejšnji element v ponovitvi in lahko vrže NoSuchElementException če ni več elementa.
public Object previous();>2.3 prejšnjiIndeks(): Vrne prejšnji indeks elementa ali -1, če je iterator seznama na začetku seznama,
niz, razvrščen v javipublic int previousIndex();>
3. Druge metode
3.1 odstrani(): Enako kot metoda remove() Iteratorja. Odstrani naslednji element v ponovitvi.
public void remove();>3.2 set (objekt objekta): Zamenja zadnji element, ki ga vrne next() ali previous(), s podanim elementom.
public void set(Object obj);>3.3 add(Object obj): Vstavi podani element na seznam na mesto pred elementom, ki bi ga vrnil next()
public void add(Object obj);>
Jasno, tri metode, ki ListIterator podeduje Iterator ( hasNext() , Naslednji() , in Odstrani() ) naredi popolnoma isto stvar v obeh vmesnikih. The hasPrevious() in prejšnje operacije so natančni analogi hasNext() in Naslednji() . Prve operacije se nanašajo na element pred (implicitnim) kazalcem, medtem ko se druge nanašajo na element za kazalcem. Prejšnja operacija premakne kazalec nazaj, naslednja pa naprej.
ListIterator nima trenutnega elementa; njegov položaj kazalca je vedno med elementom, ki bi bil vrnjen s klicem prejšnji() in element, ki bi bil vrnjen s klicem Naslednji().
1. nastavite () metoda lahko povzroči 4 izjeme.
- UnsupportedOperationException: če ta iterator seznama ne podpira nastavljene operacije
- ClassCastException: Če razred navedenega elementa preprečuje, da bi bil dodan na ta seznam
- IllegalArgumentException: Če kateri vidik določenega elementa preprečuje, da bi bil dodan na ta seznam
- IllegalStateException: Če nista bila poklicana niti naslednja niti prejšnja ali odstranitev ali dodajanje sta bila klicana po zadnjem klicu naslednjega ali prejšnjega
2. dodaj() metoda lahko povzroči 3 izjeme.
- UnsupportedOperationException: Če ta iterator seznama ne podpira metode dodajanja
- ClassCastException: Če razred navedenega elementa preprečuje, da bi bil dodan na ta seznam
- IllegalArgumentException: Če kateri vidik tega elementa preprečuje, da bi bil dodan na ta seznam
Primer
Java // 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); } }> Izhod
[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]>
Opomba: Podobno obstajajo določene omejitve pri ListIteratorju . Je najzmogljivejši iterator, vendar je uporaben le za razrede, implementirane s seznamom, zato ni univerzalni iterator.
Pomembne točke
- Upoštevajte, da bo na začetku katera koli referenca iteratorja kazala na indeks tik pred indeksom prvega elementa v zbirki.
- Objektov Enumeration, Iterator, ListIterator ne ustvarjamo, ker so vmesniki. Za ustvarjanje objektov uporabljamo metode, kot so elements(), iterator(), listIterator(). Te metode imajo anonimno Notranji razred ki razširi zadevne vmesnike in vrne ta objekt razreda.
Opomba: The $ simbol v imenu referenčnega razreda je dokaz, da se uporablja koncept notranjih razredov in da so ti objekti razreda ustvarjeni.
To je mogoče preveriti s spodnjo kodo. Za več o notranjem razredu glejte
Java // 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()); } }> Izhod
java.util.Vector java.util.Vector$Itr java.util.Vector$ListItr>
Pojasnilo
V Javi je iterator vmesnik, ki se uporablja za prehod skozi zbirko objektov enega za drugim. Uporablja se za ponavljanje katere koli podatkovne strukture, ki temelji na zbirki, vključno z nizi, seznami, nizi in zemljevidi.
Iterator ima tri glavne metode, ki se uporabljajo za prehod skozi zbirko:
abeceda v številkah
- hasNext() – Ta metoda preveri, ali je v zbirki še en element, ki ga je mogoče ponoviti.
- next() – ta metoda vrne naslednji element v zbirki.
- remove() – ta metoda odstrani trenutni element iz zbirke.
Vmesnik Iterator je del Java Collection Framework in ga izvajajo razredi, ki predstavljajo različne vrste zbirk.
Program
Java import java.util.ArrayList; import java.util.Iterator; public class IteratorExample { public static void main(String[] args) { ArrayListimena = nov ArrayList(); names.add('Alica'); names.add('Bob'); names.add('Charlie'); names.add('David'); // Ustvarjanje iteratorja za iterator seznama imeniterator = names.iterator(); // Ponavljanje po seznamu imen z uporabo iteratorja while (iterator.hasNext()) { Ime niza = iterator.next(); System.out.println(ime); } } }> Izhod
Alice Bob Charlie David>
V tem primeru smo ustvarili ArrayList nizov in mu dodali štiri imena. Nato smo ustvarili iterator za seznam z uporabo metode iterator() razreda ArrayList. Uporabili smo metodo hasNext(), da preverimo, ali je na seznamu več elementov, ki jih je treba ponoviti, in metodo next(), da dobimo naslednji element na seznamu. Vsak element smo natisnili z metodo System.out.println().
Uporaba iteratorja za prehod skozi zbirko je priročen in učinkovit način ponavljanja skozi zbirko, saj omogoča ponavljanje zbirke brez poznavanja notranje strukture zbirke. Omogoča tudi odstranjevanje elementov iz zbirke med ponavljanjem po njej.
Prednosti Iteratorja v Javi:
- Iterator je preprost vmesnik, enostaven za uporabo, ki nam omogoča, da prečkamo zbirko, ne da bi izpostavili njeno osnovno implementacijo.
- Iterator je učinkovit način za ponavljanje zbirke, še posebej, če imamo veliko količino podatkov.
- Iterator zagotavlja varen način za odstranjevanje elementov iz zbirke med iteracijo, ne da bi povzročil kakršne koli sočasne izjeme pri spreminjanju.
- Vmesnik Iterator izvajajo vsi razredi zbirk v Javi, tako da lahko uporabljamo isto kodo za ponavljanje različnih vrst zbirk.
Slabosti Iteratorja v Javi:
Obstajajo nekatere slabosti uporabe Iteratorja v Javi, kot je navedeno spodaj:
- Iterator je enosmerni vmesnik, kar pomeni, da se lahko premikamo samo naprej skozi zbirko. Ne moremo se premakniti nazaj ali skočiti na določen element.
- Iterator ni varen za niti, zato ga ne moremo uporabiti za ponavljanje zbirke v večnitnem okolju brez ustrezne sinhronizacije.
- Iterator ne nudi nobenega mehanizma za spreminjanje elementov med ponavljanjem po zbirki, razen odstranjevanja elementov. Če moramo spremeniti elemente, moramo uporabiti druge vmesnike, kot je ListIterator ali preprosto for zanko.