Enumeration vs Iterator
Υπάρχουν πολλές δομές δεδομένων που λειτουργούν ως συλλογές στην Java, όπως Vectors, πίνακες Hash και κλάσεις που υλοποιούν το πλαίσιο συλλογών Java (π.χ. HashMap, HashSet, ArrayList, TreeSet, TreeMap, LinkedList, LinkedHashMap και LinkedHashSet). Υπάρχουν πολλοί τρόποι επανάληψης μέσω των επιμέρους στοιχείων των αντικειμένων στην Java. Η Java παρέχει δύο διεπαφές για να διευκολύνει αυτήν την εργασία. Το Enumeration και το Iterator είναι δύο από τις διεπαφές που βρίσκονται στο πακέτο java.util που παρέχουν λειτουργικότητα για απαρίθμηση μέσω ακολουθιών ή αντικειμένων με ένα σύνολο στοιχείων. Το Enumerator εισήχθη στο JDK 1.0 και Iterator που εισήχθη στο JDK 1.2 ουσιαστικά αντιγράφει τη λειτουργικότητα του Enumerator (εντός του Collections Framework).
Τι είναι η απαρίθμηση;
Η απαρίθμηση είναι μια δημόσια διεπαφή σε Java, που εισήχθη στο JDK 1.0, η οποία παρέχει τη δυνατότητα απαρίθμησης μέσω ακολουθιών στοιχείων. Βρίσκεται στο πακέτο java.util. Όταν η διεπαφή Enumeration υλοποιείται από ένα αντικείμενο, αυτό το αντικείμενο μπορεί να δημιουργήσει μια ακολουθία στοιχείων. Η διεπαφή απαρίθμησης έχει δύο μεθόδους. Η μέθοδος hasMoreElements() θα ελέγξει εάν αυτή η απαρίθμηση περιέχει περισσότερα στοιχεία και η nextElement() επιστρέφει το επόμενο στοιχείο της ακολουθίας (αν υπάρχει τουλάχιστον ένα ακόμη για να πάει). Με άλλα λόγια, καλώντας το nextElement() διαδοχικά, ο προγραμματιστής μπορεί να έχει πρόσβαση στα μεμονωμένα στοιχεία της σειράς. Για παράδειγμα, για να εκτυπώσετε όλα τα στοιχεία στο Vector v1 χρησιμοποιώντας το Enumerator, μπορεί να χρησιμοποιηθεί το ακόλουθο απόσπασμα κώδικα.
Απαρίθμηση e=v1.elements();
While(e.hasMoreLements()){
System.out.println(e.nextElement());
}
Το Enumerator μπορεί επίσης να χρησιμοποιηθεί για τον καθορισμό της ροής εισόδου στα αντικείμενα SequenceInputStream.
Τι είναι το Iterator;
Το Iterator είναι μια δημόσια διεπαφή στο πακέτο Java.util, η οποία επιτρέπει την επανάληψη μέσω στοιχείων των αντικειμένων συλλογών που υλοποιούν το πλαίσιο Συλλογών (όπως ArrayList, LinkedList, κ.λπ.). Αυτό εισήχθη στο JDK 1.2 και αντικατέστησε τον Απαριθμητή στο πλαίσιο του Java Collections Framework. Το Iterator έχει τρεις μεθόδους. Η μέθοδος hasNext() ελέγχει αν υπάρχουν υπόλοιπα στοιχεία στη συλλογή και η μέθοδος next() επιστρέφει το επόμενο στοιχείο της σειράς. Η μέθοδος remove() μπορεί να χρησιμοποιηθεί για την αφαίρεση του τρέχοντος στοιχείου από την υποκείμενη συλλογή. Για παράδειγμα, για να εκτυπώσετε όλα τα στοιχεία στο Vector v1 χρησιμοποιώντας το Iterator, μπορεί να χρησιμοποιηθεί το ακόλουθο απόσπασμα κώδικα.
Iterator i=v1.elements();
While(i.hasNext()){
System.out.println(e.next());
}
Ποια είναι η διαφορά μεταξύ Enumeration και Iterator;
Αν και το Enumeration και το Iterator είναι δύο από τις διεπαφές που βρίσκονται στο πακέτο java.util, οι οποίες επιτρέπουν την επανάληψη/απαρίθμηση μέσω στοιχείων μιας σειράς, έχουν τις διαφορές τους. Στην πραγματικότητα, το Iterator, το οποίο εισήχθη μετά το Enumeration, αντικαθιστά το Enumeration στο πλαίσιο των συλλογών Java. Σε αντίθεση με το Enumeration, το Iterator είναι ασφαλές έναντι αστοχιών. Αυτό σημαίνει ότι δεν επιτρέπονται ταυτόχρονες τροποποιήσεις (στην υποκείμενη συλλογή) όταν χρησιμοποιείται το Iterator. Αυτό είναι πολύ χρήσιμο σε περιβάλλοντα πολλαπλών νημάτων όπου υπάρχει πάντα ο κίνδυνος ταυτόχρονων τροποποιήσεων. Σε περίπτωση ταυτόχρονης τροποποίησης, το αντικείμενο Iterator θα δημιουργήσει ένα ConcurrentModificationException. Το Iterator έχει μικρότερα ονόματα μεθόδων σε σύγκριση με το Enumerator. Επιπλέον, ο επαναλήπτης έχει την πρόσθετη λειτουργία διαγραφής στοιχείων κατά τη διάρκεια της επανάληψης (κάτι που δεν είναι δυνατό με τον Απαριθμητή). Έτσι, εάν υπάρχει ανάγκη να αφαιρεθούν στοιχεία από τη συλλογή, το Iterator είναι η μόνη επιλογή που μπορεί να εξεταστεί.