En Java-markør er en iterator som brukes til å iterere eller krysse eller hente en samling eller strømobjekts elementer én etter én. I denne artikkelen vil vi lære om Java Iterators og det fungerer.
Typer markører i Java
Det er tre markører i Java som nevnt nedenfor:
- Iterator
- Oppregning
- ListIterator
Merk: SplitIterator kan også betraktes som en markør da det kun er en type Iterator.
1. Iterator
Iteratorer i Java brukes i Innsamlingsramme for å hente elementer én etter én. Det er en universell iterator slik vi kan bruke den på et hvilket som helst samlingsobjekt. Ved å bruke Iterator kan vi utføre både lese- og fjerneoperasjoner. Det er en forbedret versjon av Enumeration med tilleggsfunksjonaliteten ved å fjerne et element.
Iterator må brukes når vi ønsker å telle opp elementer i alle samlingsramme-implementerte grensesnitt som Set, List, Queue, Deque og alle implementerte klasser av Map-grensesnitt. Iteratoren er bare markøren tilgjengelig for hele samlingsrammeverket. Et iteratorobjekt kan opprettes ved å kalle iterator() metode som finnes i samlingsgrensesnittet.
Syntaks
Iterator itr = c. iterator ();>
Merk: Her er c et hvilket som helst samlingsobjekt. itr er av typen Iterator-grensesnitt og refererer til c.
.tilsvarer java
Metoder for iteratorgrensesnitt i Java
Iteratorgrensesnittet definerer tre metoder som er oppført nedenfor:
1. hasNext(): Returnerer sann hvis iterasjonen har flere elementer.
public boolean hasNext();>
2. neste(): Returnerer neste element i iterasjonen. Det kaster NoSuchElementException hvis ikke flere element er tilstede.
public Object next();>
3. fjern(): Fjerner det neste elementet i iterasjonen. Denne metoden kan bare kalles én gang per kall til neste().
public void remove();>
Merk: fjerne() metoden kan gi to unntak, nemlig som følger:
- UnsupportedOperationException : Hvis fjerningsoperasjonen ikke støttes av denne iteratoren
- IllegalStateException : Hvis den neste metoden ennå ikke er kalt, eller fjernmetoden allerede er kalt etter siste kall til neste metode.
Hvordan fungerer Java Iterator internt?
I denne delen skal vi prøve å forstå hvordan Java Iterator og dens metoder fungerer internt. La oss ta følgende LinkedList-objekt for å forstå denne funksjonaliteten.
List cities = new LinkedList(); cities.add('G-1'); cities.add('G-2'); cities.add('G-3'); . . . cities.add('G-n');>La oss nå lage et Iterator-objekt på List-objektet som vist nedenfor:
Iterator citiesIterator = cities.iterator();>
cityIteartor-iteratoren vil se slik ut –
Her peker Iterators markør foran det første elementet i listen.
Nå kjører vi følgende kodebit.
citiesIterator.hasNext(); citiesIterator.next();>
Når vi kjører kodebiten ovenfor, peker Iterators markør til det første elementet i listen som vist i diagrammet ovenfor.
windows kommando arp
Nå kjører vi følgende kodebit.
citiesIterator.hasNext(); citiesIterator.next();>
Når vi kjører kodebiten ovenfor, peker Iterators markør til det andre elementet i listen som vist i diagrammet ovenfor. Gjør denne prosessen for å nå Iteratorens markør til sluttelementet på listen.
Etter å ha lest det siste elementet, hvis vi kjører kodebiten nedenfor, returnerer den en falsk verdi.
citiesIterator.hasNext();>

Ettersom Iterators markør peker på etter det siste elementet i listen, returnerer hasNext()-metoden en falsk verdi.
Merk: Etter å ha observert alle disse diagrammene, kan vi si at Java Iterator kun støtter Forward Direction Iteration som vist i diagrammet nedenfor. Så det er også kjent som Uni-Directional Cursor.

Eksempel
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 = ny ArrayList (); // Iterering over listen for (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(); // Kontroll av det neste elementet der //-betingelsen gjelder til det er enkeltelement // i listen ved å bruke hasnext()-metoden while (itr.hasNext()) { // Flytter markøren til neste element int i = itr.next( ); // Få elementer ett etter ett System.out.print(i + ' '); // Fjerne odde elementer if (i % 2 != 0) itr.remove(); } // Kommando for neste linje System.out.println(); // Skrive ut elementene inne i objektet System.out.println(al); } }> Produksjon
[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
Spliteratorer, som andre iteratorer, er for å krysse elementene i en kilde. En kilde kan være en Samling , en IO-kanal eller en generatorfunksjon. Den er inkludert i JDK 8 for støtte for effektiv parallell traversering (parallell programmering) i tillegg til sekvensiell traversering. Java Spliterator-grensesnitt er en intern iterator som deler strømmen i mindre deler. Disse mindre delene kan behandles parallelt.
Merk: I virkelighetens programmering trenger vi kanskje aldri å bruke Spliterator direkte. Under normale operasjoner vil den oppføre seg nøyaktig på samme måte som Java Iterator.
Fordeler med Java Iterator
- Vi kan bruke den til alle samlingstimer.
- Den støtter både LES- og FJERN-operasjoner.
- Det er en Universal Cursor for Collection API.
- Metodenavn er enkle og enkle å bruke dem.
Begrensninger for Java Iterator
Det er også visse begrensninger for Iterator som er oppført som følger:
- I CRUD-operasjoner støtter den IKKE CREATE- og UPDATE-operasjoner.
- Den støtter bare fremadgående iterasjon som er en enveis iterator.
- Sammenlignet med Spliterator, støtter den IKKE itererende elementer parallelt, noe som betyr at den kun støtter sekvensiell iterasjon.
- Sammenlignet med Spliterator, støtter den IKKE bedre ytelse for å iterere store datamengder.
2. Oppregning
Det er et grensesnitt som brukes til å hente elementer fra eldre samlinger (Vector, Hashtable). Enumeration er den første iteratoren til stede fra JDK 1.0, hviler er inkludert i JDK 1.2 med mer funksjonalitet. Oppregninger brukes også for å spesifisere inngangsstrømmene til en SequenceInputStream . Vi kan lage et Enumeration-objekt ved å ringe elementer() metoden til vektorklassen på et hvilket som helst vektorobjekt
Syntaks
// Here 'v' is an Vector class object. e is of // type Enumeration interface and refers to 'v' Enumeration e = v . elements ();>
Det er to metoder i Enumeration-grensesnittet, nemlig:
1. offentlig boolsk hasMoreElements(): Denne metoden tester om denne oppregningen inneholder flere elementer eller ikke.
2. offentlig objekt nesteElement(): Denne metoden returnerer det neste elementet i denne oppregningen. Den kaster NoSuchElementException hvis ikke flere elementer er til stede
Eksempel
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 + ' '); } } }> Produksjon
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 0 1 2 3 4 5 6 7 8 9>
Det er visse begrensninger for oppregning som er som følger:
- Oppregning er for arv bare klasser (vektor, hashtabell). Derfor er det ikke en universell iterator.
- Fjerningsoperasjoner kan ikke utføres ved hjelp av Enumeration.
- Kun forovergående iterasjon er mulig.
Likheter mellom Java Enumeration og Iterator
- Begge er Java-markører.
- Begge brukes til å iterere en samling av objektelementer én etter én.
- Begge støtter READ- eller Retrieval-operasjon.
- Begge er Uni-directional Java Cursorer som betyr at de kun støtter Forward Direction Iteration.
Forskjeller mellom Java Enumeration og Iterator
Følgende tabell beskriver forskjellene mellom Java Enumeration og Iterator:
| Oppregning | Iterator |
|---|---|
| Introdusert i Java 1.0 | Introdusert i Java 1.2 |
| Eldre grensesnitt | Ikke eldre grensesnitt |
| Den brukes kun til å iterere Legacy Collection-klasser. | Vi kan bruke den til alle samlingstimer. |
| Den støtter kun READ-operasjon. | Den støtter både LES- og SLETT-operasjoner. |
| Det er ikke Universal Cursor. | Det er en universell markør. |
| Lange metodenavn. | Enkle og brukervennlige metodenavn. |
3. ListIterator
Det er bare aktuelt for listesamlingsimplementerte klasser som ArrayList, LinkedList, etc. Det gir toveis iterasjon. ListIterator må brukes når vi ønsker å telle opp elementer i List. Denne markøren har mer funksjonalitet(metoder) enn iterator. ListIterator-objekt kan opprettes ved å ringe listIterator() metode som finnes i List-grensesnittet.
Syntaks
ListIterator ltr = l. listIterator ();>
Merk: Her er l et hvilket som helst List-objekt, ltr er av typen. ListIterator-grensesnittet og refererer til l. ListIterator-grensesnittet utvider Iterator-grensesnittet. Så alle tre metodene for Iterator-grensesnitt er tilgjengelige for ListIterator. I tillegg finnes det seks flere metoder.
1. Retning fremover
1.1 hasNext(): Returnerer sann hvis iterasjonen har flere elementer
public boolean hasNext();>1.2 neste(): Samme som next()-metoden til Iterator. Returnerer neste element i iterasjonen.
public Object next();>1.3 nextIndex(): Returnerer neste elementindeks eller listestørrelse hvis listeiteratoren er på slutten av listen.
public int nextIndex();>
2. Retning bakover
2.1 hasPrevious(): Returnerer sann hvis iterasjonen har flere elementer mens den går bakover.
public boolean hasPrevious();>2.2 forrige(): Returnerer forrige element i iterasjonen og kan kaste NoSuchElementException hvis det ikke er flere element tilstede.
public Object previous();>2.3 forrige indeks(): Returnerer forrige elementindeks eller -1 hvis listeiteratoren er på begynnelsen av listen,
java listepublic int previousIndex();>
3. Andre metoder
3.1 fjern(): Samme som remove()-metoden til Iterator. Fjerner det neste elementet i iterasjonen.
public void remove();>3.2 sett(Objektobjekt): Erstatter det siste elementet returnert av next() eller previous() med det angitte elementet.
public void set(Object obj);>3.3 add(Object obj): Setter inn det angitte elementet i listen på posisjonen før elementet som ville bli returnert av next()
public void add(Object obj);>
Tydelig, de tre metodene som ListIterator arver fra Iterator ( hasNext() , neste() , og fjerne() ) gjør nøyaktig det samme i begge grensesnittene. De hasPrevious() og de tidligere operasjonene er eksakte analoger av hasNext() og neste() . De tidligere operasjonene refererer til elementet før den (implisitte) markøren, mens sistnevnte refererer til elementet etter markøren. Den forrige operasjonen flytter markøren bakover, mens den neste flytter den fremover.
ListIterator har ikke noe gjeldende element; dens markørposisjon ligger alltid mellom elementet som ville bli returnert av et kall til tidligere() og elementet som ville bli returnert av et kall til neste().
1 sett() metoden kan gi 4 unntak.
- UnsupportedOperationException: hvis den angitte operasjonen ikke støttes av denne listeiteratoren
- ClassCastException: Hvis klassen til det angitte elementet hindrer det i å bli lagt til denne listen
- UlovligArgumentUnntak: Hvis et aspekt av det angitte elementet hindrer det i å bli lagt til denne listen
- IllegalStateException: Hvis verken neste eller forrige har blitt kalt, eller fjern eller legg til har blitt kalt etter siste anrop til neste eller forrige
2. legg til() metoden kan gi 3 unntak.
- UnsupportedOperationException: Hvis add-metoden ikke støttes av denne listeiteratoren
- ClassCastException: Hvis klassen til det angitte elementet hindrer det i å bli lagt til denne listen
- UlovligArgumentUnntak: Hvis et aspekt av dette elementet hindrer det i å bli lagt til denne listen
Eksempel
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); } }> Produksjon
[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]>
Merk: På samme måte er det visse begrensninger med ListIterator . Det er den kraftigste iteratoren, men den er bare aktuelt for List-implementerte klasser, så det er ikke en universell iterator.
Viktige poeng
- Vær oppmerksom på at til å begynne med vil enhver iteratorreferanse peke til indeksen rett før indeksen til det første elementet i en samling.
- Vi lager ikke objekter med Enumeration, Iterator, ListIterator fordi de er grensesnitt. Vi bruker metoder som elements(), iterator(), listIterator() for å lage objekter. Disse metodene har en anonym Indre klasse som utvider respektive grensesnitt og returnerer dette klasseobjektet.
Merk: De $ symbol i referanseklassenavn er et bevis på at konseptet med indre klasser brukes og disse klasseobjektene er opprettet.
2 til 1 multiplekser
Dette kan bekreftes med koden nedenfor. For mer om indre klasse se
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()); } }> Produksjon
java.util.Vector java.util.Vector$Itr java.util.Vector$ListItr>
Forklaring
I Java er en iterator et grensesnitt som brukes til å krysse gjennom en samling objekter én etter én. Den brukes til å iterere gjennom enhver samlingsbasert datastruktur, inkludert matriser, lister, sett og kart.
En iterator har tre hovedmetoder som brukes til å krysse gjennom samlingen:
- hasNext() – Denne metoden sjekker om det er et annet element i samlingen som kan itereres over.
- next() – Denne metoden returnerer det neste elementet i samlingen.
- remove() – Denne metoden fjerner det gjeldende elementet fra samlingen.
Iterator-grensesnittet er en del av Java Collection Framework, og det implementeres av klassene som representerer de forskjellige typene samlinger.
Program
Java import java.util.ArrayList; import java.util.Iterator; public class IteratorExample { public static void main(String[] args) { ArrayListnavn = ny ArrayList(); names.add('Alice'); names.add('Bob'); names.add('Charlie'); names.add('David'); // Opprette en iterator for navnelisten Iteratoriterator = navn.iterator(); // Itererer over navnelisten ved å bruke iteratoren while (iterator.hasNext()) { String name = iterator.next(); System.out.println(navn); } } }> Produksjon
Alice Bob Charlie David>
I dette eksemplet har vi laget en ArrayList med strenger og lagt til fire navn til den. Vi har deretter laget en iterator for listen ved å bruke iterator()-metoden til ArrayList-klassen. Vi har brukt hasNext()-metoden for å sjekke om det er flere elementer i listen som skal itereres over, og next()-metoden for å få neste element i listen. Vi har skrevet ut hvert element ved å bruke System.out.println()-metoden.
Å bruke en iterator for å krysse gjennom en samling er en praktisk og effektiv måte å iterere gjennom samlingen på fordi det lar samlingen itereres uten å kjenne den interne strukturen til samlingen. Det gjør det også mulig å fjerne elementer fra samlingen mens du itererer over den.
Fordeler med Iterator i Java:
- Iterator er et enkelt og brukervennlig grensesnitt som lar oss krysse en samling uten å avsløre dens underliggende implementering.
- Iterator er en effektiv måte å iterere over en samling, spesielt når vi har en stor mengde data.
- Iteratoren gir en sikker måte å fjerne elementer fra en samling under iterasjon uten å forårsake samtidige modifikasjonsunntak.
- Iterator-grensesnittet er implementert av alle samlingsklassene i Java, så vi kan bruke samme kode for å iterere over ulike typer samlinger.
Ulemper med Iterator i Java:
Det er visse ulemper ved å bruke Iterator i Java som nevnt nedenfor:
- Iteratoren er et ensrettet grensesnitt, noe som betyr at vi bare kan gå videre gjennom en samling. Vi kan ikke gå bakover eller hoppe til et bestemt element.
- Iteratoren er ikke trådsikker, så vi kan ikke bruke den til å iterere over en samling i et flertrådsmiljø uten riktig synkronisering.
- Iteratoren gir ingen mekanisme for å modifisere elementer mens den itererer over en samling, bortsett fra å fjerne elementer. Hvis vi trenger å endre elementer, må vi bruke andre grensesnitt som ListIterator eller en enkel for loop.