Enumeration vs Iterator
Der er mange datastrukturer, der fungerer som samlinger i Java, såsom vektorer, Hash-tabeller og klasser, der implementerer Java Collections Framework (dvs. HashMap, HashSet, ArrayList, TreeSet, TreeMap, LinkedList, LinkedHashMap og LinkedHashSet). Der er adskillige måder at iterere gennem de individuelle elementer i objekterne i Java. Java har to grænseflader for at gøre denne opgave lettere. Enumeration og Iterator er to af de grænseflader, der findes i java.util-pakken, der giver funktionalitet til at optælle gennem sekvenser eller objekter med et sæt elementer. Enumerator blev introduceret i JDK 1.0 og Iterator, som blev introduceret i JDK 1.2, dublerer praktisk t alt funktionaliteten af Enumerator (inden for Collections Framework).
Hvad er enumeration?
Enumeration er en offentlig grænseflade i Java, introduceret i JDK 1.0, som giver mulighed for at opregne gennem sekvenser af elementer. Det findes under java.util-pakken. Når Enumeration-grænsefladen er implementeret af et objekt, kan dette objekt generere en sekvens af elementer. Optællingsgrænsefladen har to metoder. Metoden hasMoreElements() vil teste, om denne opregning indeholder flere elementer, og nextElement() returnerer det næste element i sekvensen (hvis der er mindst et mere tilbage). Med andre ord, ved at kalde nextElement() successivt, kan programmøren få adgang til de individuelle elementer i serien. For eksempel, for at udskrive alle elementer i Vector v1 ved hjælp af Enumerator, kan følgende kodestykke bruges.
Enumeration e=v1.elements();
While(e.hasMoreLements()){
System.out.println(e.nextElement());
}
Enumerator kan også bruges til at definere inputstrømmen til SequenceInputStream-objekterne.
Hvad er Iterator?
Iterator er en offentlig grænseflade i Java.util-pakken, som tillader iteration gennem elementer i samlingsobjekterne, der implementerer samlingsrammerne (såsom ArrayList, LinkedList osv.). Dette blev introduceret i JDK 1.2 og erstattede Enumerator i Java Collections Framework. Iterator har tre metoder. Metoden hasNext() tester, om der er resterende elementer i samlingen, og næste() metoden returnerer det næste element i serien. Metoden remove() kan bruges til at fjerne det aktuelle element fra den underliggende samling. For f.eks. at udskrive alle elementer i Vector v1 ved hjælp af Iterator, kan følgende kodestykke bruges.
Iterator i=v1.elements();
While(i.hasNext()){
System.out.println(e.next());
}
Hvad er forskellen mellem Enumeration og Iterator?
Selvom Enumeration og Iterator er to af de grænseflader, der findes i java.util-pakken, som tillader iteration/optælling gennem elementer i en serie, har de deres forskelle. Faktisk erstatter Iterator, som blev introduceret efter Enumeration, Enumeration inden for Java Collections-rammen. I modsætning til Enumeration er Iterator fejlsikker. Dette betyder, at samtidige ændringer (til den underliggende samling) ikke er tilladt, når Iterator bruges. Dette er meget nyttigt i flertrådede miljøer, hvor der altid er risiko for samtidige ændringer. I tilfælde af en samtidig ændring, vil Iterator-objektet kaste en ConcurrentModificationException. Iterator har kortere metodenavne sammenlignet med Enumerator. Ydermere har iterator den ekstra funktionalitet at slette elementer under iterationen (hvilket ikke er muligt ved hjælp af Enumerator). Så hvis der er behov for at fjerne elementer fra samlingen, er Iterator den eneste mulighed, der kan overvejes.