Wat is het verschil tussen iterator en iterable en hoe deze te gebruiken?

Ik ben nieuw in Java en ik ben echt in de war met iterator en iterable. Kan iemand het mij uitleggen en enkele voorbeelden geven?


Antwoord 1, autoriteit 100%

Een Iterableis een eenvoudige weergave van een reeks elementen die kunnen worden herhaald. Het heeft geen iteratiestatus zoals een “huidig element”. In plaats daarvan heeft het één methode die een Iteratorproduceert.

Een Iteratoris het object met de iteratiestatus. Het laat je controleren of het meer elementen heeft met behulp van hasNext()en naar het volgende element gaan (indien aanwezig) met next().

Normaal gesproken zou een Iterableeen willekeurig aantal geldige Iterators moeten kunnen produceren.


Antwoord 2, autoriteit 42%

Een implementatie van Iterableis er een die een Iteratorvan zichzelf levert:

public interface Iterable<T>
{
    Iterator<T> iterator();
}

Een iterator is een eenvoudige manier om sommigen door een verzameling gegevens te laten lopen zonder toewijzingsrechten (hoewel met de mogelijkheid om te verwijderen).

public interface Iterator<E>
{
    boolean hasNext();
    E next();
    void remove();
}

Zie Javadoc.


Antwoord 3, autoriteit 11%

Ik zal de vraag met name over ArrayList als voorbeeld beantwoorden om je te helpen het beter te begrijpen..

  1. De itereerbare interface dwingt zijn subklassen om de abstracte methode ‘iterator()’ te implementeren.
public interface Iterable {
  ...
  abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T.
  ...
}
  1. Iterator-interface dwingt zijn subclasses om abstracte methode ‘Hasnext ()’ en ‘Volgende ()’ te implementeren.
public interface Iterator {
  ...
  abstract boolean hasNext(); //Returns true if the iteration has more elements.
  abstract E next();          //Returns the next element in the iteration.
  ...
}
  1. ArrayList Implementing Lijst, lijst Extends Collection and Collection verlengt Itable ..
    Dat is, je kon de relatie zien zoals

    Itable & LT; – COLLECTION & LT; – LIJST & LT; – ArrayList ‘

.
En tiselijke, verzameling en lijst, verklaren alleen abstracte methode ‘iterator ()’ en arrayclist alleen implementeert het.

  1. Ik ga de broncode van Arrayclist weergeven met ‘iterator ()’ methode als volgt voor meer gedetailleerde informatie.

‘iTerator ()’ Werkwijze retourneert een object van klasse ‘ITR’ die ‘iterator’ implementeert.

public class ArrayList<E> ... implements List<E>, ...
{
  ...
  public Iterator<E> iterator() {
              return new Itr();
  }
  private class Itr implements Iterator<E> {
          ...
          public boolean hasNext() {
              return cursor != size;
          }
          @SuppressWarnings("unchecked")
          public E next() {
              checkForComodification();
              int i = cursor;
              if (i >= size)
                  throw new NoSuchElementException();
              Object[] elementData = ArrayList.this.elementData;
              if (i >= elementData.length)
                  throw new ConcurrentModificationException();
              cursor = i + 1;
              return (E) elementData[lastRet = i];
          }
          ...
  }
}
  1. Sommige andere methoden of klassen zullen elementen van collecties zoals ArrayList herhalen door gebruik te maken van Iterator (Itr).

Hier is een eenvoudig voorbeeld.

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");
    list.add("f");
    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
        String string = iterator.next();
        System.out.println(string);
    }
}

Is het nu duidelijk? 🙂


Antwoord 4, autoriteit 7%

Als een verzameling itereerbaar is, kan deze worden herhaald met behulp van een iterator (en kan bijgevolg worden gebruikt in een for-elke lus.) De iterator is het werkelijke object dat door de verzameling zal worden herhaald.


Antwoord 5, autoriteit 4%

Ik weet dat dit een oude vraag is, maar voor iedereen die dit leest en vastzit met dezelfde vraag en die misschien overweldigd wordt door alle terminologie, is hier een goede, eenvoudige analogie om je te helpen dit onderscheid tussen iterables en iterators te begrijpen:

Denk aan een openbare bibliotheek. Ouderwets. Met papieren boeken. Ja, dat soort bibliotheek.

Een plank vol boeken zou een herhaling zijn. Je ziet de lange rij boeken in de plank. Je weet misschien niet hoeveel, maar je kunt zien dat het een lange verzameling boeken is.

De bibliothecaris zou zijn als de iterator. Hij kan op elk moment naar een specifiek boek wijzen. Hij kan het boek invoegen/verwijderen/wijzigen/lezen op de plaats waar hij naar wijst. Hij wijst, in volgorde, naar elk boek tegelijk, elke keer dat je “volgende!” roept. naar hem. Dus normaal gesproken zou je hem vragen: “heeft de volgende?”, en hij zal “ja” zeggen, waarop je “volgende!” zegt. en hij zal naar het volgende boek wijzen. Hij weet ook wanneer hij het einde van de plank heeft bereikt, zodat wanneer je vraagt: “heeft Next?” hij zal “nee” zeggen.

Ik weet dat het een beetje gek is, maar ik hoop dat dit helpt.


Antwoord 6, autoriteit 4%

Door de Iterable-interface te implementeren, kan een object het doelwit zijn van de “foreach”-instructie.

class SomeClass implements Iterable<String> {}
class Main 
{
  public void method()
  {
     SomeClass someClass = new SomeClass();
     .....
    for(String s : someClass) {
     //do something
    }
  }
}

Iterator is een interface met een implementatie voor het herhalen van elementen. Iterable is een interface die Iterator biedt.


Antwoord 7, autoriteit 4%

De belangrijkste overweging is of het item in kwestie meer dan één keer moet kunnen worden doorlopen. Dit komt omdat je een Iterable altijd kunt terugspoelen door iterator() opnieuw aan te roepen, maar er is geen manier om een Iterator terug te spoelen.


Antwoord 8

Zoals uitgelegd hier , de” Itable “is ingevoerd om in de foreachlus te kunnen gebruiken. Een klasse implementeert het Itable -interface kan worden geërbeerd.

iterator is klasse die de iteratie beheert over een Itable . Het handhaaft een staat van waar we in de huidige iteratie zijn en weet wat het volgende element is en hoe het te krijgen.


Antwoord 9

Overweeg een voorbeeld met 10 appels.
Wanneer het optimuleert, is het alsof ze elke appel in dozen van 1 tot 10 plaatsen en een iterator retourneren dat kan worden gebruikt om te navigeren.

Door iterator te implementeren, kunnen we appel, appel in de volgende dozen enz.

Itable implementeren geeft een iterator om zijn elementen te navigeren, hoewel ze navigeren, iterator moet worden geïmplementeerd.


Antwoord 10

Vraag: verschil tussen tiselijke en iterator?
ANS:

Itable: Het is gerelateerd aan Foreach Loop
iterator: is gerelateerd aan verzameling

Het doelelement van de foreach lus-shouble is iezak.
We kunnen iterator gebruiken om het object één voor één uit de collectie

te krijgen

Itable cadeau in Java.ḷang pakket
Iterator aanwezig in Java.Util-pakket

bevat slechts één methode iterator ()
Bevat drie methode hasnext (), volgende (), verwijderen ()

geïntroduceerd in 1,5 versie
Geïntroduceerd in 1.2 versie


Antwoord 11

In principe spreekt ze allebei zeer nauw met elkaar gerelateerd.

Overweeg iterator om een ​​interface te zijn die ons helpt bij het doorlopen door een verzameling met behulp van enkele ongedefinieerde methoden zoals hasnext (), volgende () en verwijderen ()

Aan de andere kant, Iterable is een interface, die, indien uitgevoerd door een klassenkrachten de klasse Iterable en een doelwit voor voor-elk construct.
Het heeft slechts één methode genaamd iterator () die afkomstig is van Iterator interface zelf.

Wanneer een collectie iterable, dan kan worden herhaald met behulp van een repeater.

Voor begrip bezoek volgende:

Iterable: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Iterable.java

iterator http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Iterator.java


Antwoord 12

In aanvulling op ColinD en seeker antwoorden.

In eenvoudige termen, Iterable en Iterator zijn beide interfaces voorzien in Collection Framework Java.

Iterable

Een klasse moet de uitvoering van de Iterable-interface, wil het een for-each lus om itereren over de collectie. Echter, de for-each lus kan alleen worden gebruikt om door de collectie in de voorwaartse richting en je zult niet in staat zijn om de elementen in deze inzameling aan te passen. Maar, als alles wat je wilt is om de elementen gegevens te lezen, dan is het zeer eenvoudig en dankzij Java lambda-expressie is het vaak one-liner. Bijvoorbeeld:

iterableElements.forEach (x -> System.out.println(x) );

Iterator

Met deze interface kunt u een verzameling herhalen en de elementen ervan verkrijgen en verwijderen. Elk van de collectieklassen biedt een iterator()methode die een iterator terugstuurt naar het begin van de collectie. Het voordeel van deze interface ten opzichte van iterable is dat je met deze interface elementen in een collectie kunt toevoegen, wijzigen of verwijderen. Maar toegang tot elementen heeft iets meer code nodig dan itereerbaar. Bijvoorbeeld:

for (Iterator i = c.iterator(); i.hasNext(); ) {
       Element e = i.next();    //Get the element
       System.out.println(e);    //access or modify the element
}

Bronnen:

  1. Java Doc Iterable
  2. Java Doc Iterator

Antwoord 13

Iterableis geïntroduceerd om te gebruiken in voor elke lus in java

public interface Collection<E> extends Iterable<E>  

Iteratoris een klasse die iteratie beheert over een Iterable. Het houdt een staat bij van waar we ons bevinden in de huidige iteratie, en weet wat het volgende element is en hoe het te krijgen.

Other episodes