Προγραμματισμός

Ξεκινήστε με το Java Συλλογές Framework

Το JDK 1.2 εισάγει ένα νέο πλαίσιο για συλλογές αντικειμένων, που ονομάζεται Java Συλλογές Πλαίσιο. "Ω όχι," φωνάζεις ", όχι άλλο API, ούτε άλλο πλαίσιο για μάθηση!" Αλλά περιμένετε, προτού απομακρυνθείτε, ακούστε με: Το πλαίσιο Συλλογών αξίζει την προσπάθειά σας και θα ωφελήσει τον προγραμματισμό σας με πολλούς τρόπους. Τρία μεγάλα οφέλη έρχονται αμέσως στο μυαλό:

  • Αυξάνει δραματικά την αναγνωσιμότητα των συλλογών σας παρέχοντας ένα τυπικό σύνολο διεπαφών που θα χρησιμοποιούνται από πολλούς προγραμματιστές σε πολλές εφαρμογές.
  • Κάνει τον κωδικό σας πιο ευέλικτο, επιτρέποντάς σας να περάσετε και να επιστρέψετε διεπαφές αντί για συγκεκριμένες κατηγορίες, γενικεύοντας τον κωδικό σας αντί να τον κλειδώσετε.
  • Προσφέρει πολλές συγκεκριμένες υλοποιήσεις των διεπαφών, επιτρέποντάς σας να επιλέξετε τη συλλογή που είναι πιο κατάλληλη και προσφέρει την υψηλότερη απόδοση για τις ανάγκες σας.

Και αυτό είναι μόνο για αρχάριους.

Η περιήγησή μας στο πλαίσιο θα ξεκινήσει με μια επισκόπηση των πλεονεκτημάτων που παρέχει για την αποθήκευση σετ αντικειμένων. Όπως θα ανακαλύψετε σύντομα, επειδή οι παλιοί φίλοι σας Hashtable και Διάνυσμα υποστηρίξτε το νέο API, τα προγράμματά σας θα είναι ομοιόμορφα και συνοπτικά - κάτι που εσείς και οι προγραμματιστές που θα έχουν πρόσβαση στον κωδικό σας σίγουρα θα ενθουσιαστούν.

Μετά την προκαταρκτική μας συζήτηση, θα ανακαλύψουμε βαθύτερα τις λεπτομέρειες.

Το πλεονέκτημα Java Συλλογές: Μια επισκόπηση

Πριν το Συλλογές έκανε το πιο ευπρόσδεκτο ντεμπούτο του, οι τυπικές μέθοδοι για την ομαδοποίηση αντικειμένων Java ήταν μέσω του πίνακα, το Διάνυσμα, και το Hashtable. Και οι τρεις αυτές συλλογές έχουν διαφορετικές μεθόδους και σύνταξη για την πρόσβαση σε μέλη: οι πίνακες χρησιμοποιούν τα σύμβολα του τετραγώνου αγκύλη ([]), Διάνυσμα χρησιμοποιεί το στοιχείοΑτ μέθοδος και Hashtable χρήσεις παίρνω και βάζω μεθόδους. Αυτές οι διαφορές οδήγησαν εδώ και καιρό τους προγραμματιστές στο δρόμο για ασυνέπεια στην εφαρμογή των δικών τους συλλογών - ορισμένοι μιμούνται το Διάνυσμα μέθοδοι πρόσβασης και μερικοί μιμούνται το Απαρίθμηση διεπαφή.

Για να περιπλέξει περαιτέρω τα θέματα, τα περισσότερα από τα Διάνυσμα οι μέθοδοι επισημαίνονται ως τελικές. δηλαδή, δεν μπορείτε να επεκτείνετε το Διάνυσμα τάξη για την εφαρμογή παρόμοιου είδους συλλογής. Θα μπορούσαμε να δημιουργήσουμε μια τάξη συλλογής που έμοιαζε με Διάνυσμα και ενήργησε σαν Διάνυσμα, αλλά δεν μπόρεσε να περάσει σε μια μέθοδο που παίρνει ένα Διάνυσμα ως παράμετρος.

Τέλος, καμία από τις συλλογές (πίνακας, Διάνυσμα ή Hashtable) εφαρμόζει μια τυπική διεπαφή πρόσβασης μέλους. Καθώς οι προγραμματιστές ανέπτυξαν αλγόριθμους (όπως είδη) για χειρισμό συλλογών, ξεκίνησε ένας θερμός λόγος για το αντικείμενο που πρέπει να περάσει στον αλγόριθμο. Εάν περάσετε έναν πίνακα ή ένα Διάνυσμα; Πρέπει να εφαρμόσετε και τις δύο διεπαφές; Μιλήστε για αντιγραφή και σύγχυση.

Ευτυχώς, το Java Συλλογές Πλαίσιο διορθώνει αυτά τα προβλήματα και προσφέρει πολλά πλεονεκτήματα από τη χρήση χωρίς πλαίσιο ή τη χρήση του Διάνυσμα και Hashtable:

  • Ένα εύχρηστο σύνολο διεπαφών συλλογής

    Με την εφαρμογή μιας από τις βασικές διεπαφές - Συλλογή, Σειρά, Λίστα, ή Χάρτης - διασφαλίζετε ότι η τάξη σας συμμορφώνεται με ένα κοινό API και γίνεται πιο τακτική και κατανοητή. Έτσι, εάν εφαρμόζετε μια βάση δεδομένων SQL, έναν αντιστοιχιστή χρωμάτων ή μια εφαρμογή απομακρυσμένης συνομιλίας, εάν εφαρμόσετε το Συλλογή διεπαφή, οι λειτουργίες στη συλλογή αντικειμένων σας είναι γνωστές στους χρήστες σας. Οι τυπικές διεπαφές απλοποιούν επίσης τη μεταφορά και επιστροφή συλλογών από και προς μεθόδους κλάσης και επιτρέπουν στις μεθόδους να λειτουργούν σε μια ευρύτερη ποικιλία συλλογών.

  • Ένα βασικό σύνολο υλοποιήσεων συλλογής

    Εκτός από τον αξιόπιστο Hashtable και Διάνυσμα, τα οποία έχουν ενημερωθεί για την εφαρμογή του Συλλογή διεπαφές, νέες εφαρμογές συλλογής έχουν προστεθεί, συμπεριλαμβανομένων HashSet και TreeSet, Λίστα Array και Συνδεδεμένη λίστα, και HashMap και Χάρτης. Η χρήση μιας υπάρχουσας, κοινής εφαρμογής κάνει τον κώδικά σας πιο σύντομο και πιο γρήγορο για λήψη. Επίσης, χρησιμοποιώντας τον υπάρχοντα πυρήνα κώδικα Java, διασφαλίζεται ότι τυχόν βελτιώσεις στον βασικό κώδικα θα βελτιώσουν επίσης την απόδοση του κώδικα σας.

  • Άλλες χρήσιμες βελτιώσεις

    Κάθε συλλογή επιστρέφει τώρα ένα Επαναληπτής, βελτιωμένος τύπος Απαρίθμηση που επιτρέπει λειτουργίες στοιχείων όπως εισαγωγή και διαγραφή. ο Επαναληπτής είναι "γρήγορη αποτυχία", που σημαίνει ότι λαμβάνετε μια εξαίρεση εάν η λίστα που πραγματοποιείτε επανάληψη αλλάζει από άλλον χρήστη. Επίσης, συλλογές βάσει λίστας όπως Διάνυσμα επιστροφή α Λίστα επαναληπτών που επιτρέπουν αμφίδρομη επανάληψη και ενημέρωση.

    Διάφορες συλλογές (TreeSet και Χάρτης δέντρου) υποστηρίζει έμμεσα την παραγγελία. Χρησιμοποιήστε αυτές τις τάξεις για να διατηρήσετε μια ταξινομημένη λίστα χωρίς προσπάθεια. Μπορείτε να βρείτε τα μικρότερα και μεγαλύτερα στοιχεία ή να εκτελέσετε μια δυαδική αναζήτηση για να βελτιώσετε την απόδοση μεγάλων λιστών. Μπορείτε να ταξινομήσετε άλλες συλλογές παρέχοντας μια μέθοδο σύγκρισης συλλογής (α Συγκριτής αντικείμενο) ή μια μέθοδο σύγκρισης αντικειμένων (η Συγκρίσιμος διεπαφή).

    Τέλος, μια στατική τάξη Συλλογές παρέχει μη τροποποιήσιμες (μόνο για ανάγνωση) και συγχρονισμένες εκδόσεις υπαρχουσών συλλογών. Οι μη τροποποιήσιμες τάξεις είναι χρήσιμες για την αποτροπή ανεπιθύμητων αλλαγών σε μια συλλογή. Η συγχρονισμένη έκδοση μιας συλλογής είναι απαραίτητη για πολυνηματικά προγράμματα.

Το Java Συλλογές Πλαίσιο είναι μέρος του Core Java και περιέχεται στο java.util.collections πακέτο JDK 1.2. Το πλαίσιο είναι επίσης διαθέσιμο ως πακέτο για το JDK 1.1 (βλ. Πόρους).

Σημείωση: Η έκδοση συλλογών JDK 1.1 ονομάζεται com.sun.java.util.collections. Λάβετε υπόψη ότι ο κώδικας που αναπτύχθηκε με την έκδοση 1.1 πρέπει να ενημερωθεί και να μεταγλωττιστεί εκ νέου για το 1.2 verson, και τυχόν αντικείμενα που σειριοποιούνται στο 1.1 δεν μπορούν να αποστειρωθούν σε 1.2.

Ας δούμε τώρα πιο προσεκτικά αυτά τα πλεονεκτήματα ασκώντας το Java Συλλογές Πλαίσιο με κάποιο δικό μας κώδικα.

Ένα καλό API

Το πρώτο πλεονέκτημα του Java Συλλογές Framework είναι ένα συνεπές και κανονικό API. Το API κωδικοποιείται σε ένα βασικό σύνολο διεπαφών, Συλλογή, Σειρά, Λίστα, ή Χάρτης. ο Συλλογή Η διεπαφή περιέχει βασικές λειτουργίες συλλογής, όπως προσθήκη, αφαίρεση και δοκιμές συμμετοχής (περιορισμός). Οποιαδήποτε εφαρμογή μιας συλλογής, είτε αυτή παρέχεται από το Java Συλλογές Πλαίσιο είτε μία από τις δικές σας δημιουργίες, θα υποστηρίζει μία από αυτές τις διεπαφές. Επειδή το πλαίσιο Συλλογών είναι τακτικό και συνεπές, θα μάθετε ένα μεγάλο μέρος των πλαισίων απλώς μαθαίνοντας αυτές τις διεπαφές.

Και τα δυο Σειρά και Λίστα εφαρμόστε το Συλλογή διεπαφή. ο Σειρά διεπαφή είναι ίδια με το Συλλογή διεπαφή εκτός από μια πρόσθετη μέθοδο, στο Array, το οποίο μετατρέπει ένα Σειρά σε ένα Αντικείμενο πίνακας. ο Λίστα διεπαφή εφαρμόζει επίσης το Συλλογή διεπαφή, αλλά παρέχει πολλούς βοηθητές που χρησιμοποιούν έναν ακέραιο ευρετήριο στη λίστα. Για παράδειγμα, παίρνω, αφαιρώ, και σειρά όλοι παίρνουν έναν ακέραιο αριθμό που επηρεάζει το ευρετήριο στοιχείο στη λίστα. ο Χάρτης διεπαφή δεν προέρχεται από τη συλλογή, αλλά παρέχει μια διεπαφή παρόμοια με τις μεθόδους στο java.util.Hashtable. Τα κλειδιά χρησιμοποιούνται για την τοποθέτηση και τη λήψη τιμών. Κάθε μία από αυτές τις διεπαφές περιγράφεται στα ακόλουθα παραδείγματα κώδικα.

Το παρακάτω τμήμα κώδικα δείχνει τον τρόπο εκτέλεσης πολλών Συλλογή λειτουργίες στις HashSet, μια βασική συλλογή που εφαρμόζει το Σειρά διεπαφή. ΕΝΑ HashSet είναι απλώς ένα σύνολο που δεν επιτρέπει διπλά στοιχεία και δεν διατάζει ή τοποθετεί τα στοιχεία του. Ο κώδικας δείχνει πώς δημιουργείτε μια βασική συλλογή και προσθέτετε, αφαιρείτε και δοκιμάστε στοιχεία. Επειδή Διάνυσμα υποστηρίζει τώρα το Συλλογή διεπαφή, μπορείτε επίσης να εκτελέσετε αυτόν τον κώδικα σε ένα διάνυσμα, τον οποίο μπορείτε να δοκιμάσετε αλλάζοντας το HashSet δήλωση και κατασκευαστής α Διάνυσμα.

εισαγωγή java.util.collections. *; δημόσια τάξη CollectionTest {// Statics public static void main (String [] args) {System.out.println ("Collection Test"); // Δημιουργία συλλογής συλλογή HashSet = νέο HashSet (); // Προσθήκη String dog1 = "Max", dog2 = "Bailey", dog3 = "Harriet"; collection.add (dog1); collection.add (dog2); collection.add (dog3); // Sizing System.out.println ("Η συλλογή δημιουργήθηκε" + ", size =" + collection.size () + ", isEmpty =" + collection.isEmpty ()); // Containment System.out.println ("Η συλλογή περιέχει" + dog3 + ":" + collection.contains (dog3)); // Επανάληψη. Το Iterator υποστηρίζει hasNext, στη συνέχεια, καταργήστε το System.out.println ("Επανάληψη συλλογής (χωρίς ταξινόμηση):"); Iterator iterator = collection.iterator (); ενώ (iterator.hasNext ()) System.out.println ("" + iterator.next ()); // Κατάργηση της συλλογής. Αφαίρεση (dog1); collection.clear (); }} 

Ας αξιοποιήσουμε τώρα τις βασικές γνώσεις μας για συλλογές και ας δούμε άλλες διεπαφές και υλοποιήσεις στο Java Συλλογές Πλαίσιο.

Καλές συγκεκριμένες υλοποιήσεις

Έχουμε ασκήσει το Συλλογή διεπαφή σε συγκεκριμένη συλλογή, το HashSet. Ας δούμε τώρα το πλήρες σύνολο εφαρμογών συλλογής σκυροδέματος που παρέχονται στο πλαίσιο Συλλογών Java. (Δείτε την ενότητα Πόροι για έναν σύνδεσμο προς το σχολιασμένο περίγραμμα του πλαισίου Java Συλλογές της Sun.)

Εφαρμογές
Πίνακας κατακερματισμούΑλλαγή μεγέθους σειράςΙσορροπημένο δέντρο (Ταξινόμηση)Συνδεδεμένη λίσταΚληρονομιά
Διεπαφές ΣειράHashSet* TreeSet* *
Λίστα* Λίστα Array* Συνδεδεμένη λίσταΔιάνυσμα
ΧάρτηςHashMap* Χάρτης δέντρου* Hashtable

Οι υλοποιήσεις που σημειώνονται με αστερίσκο (*) δεν έχουν νόημα ή δεν παρέχουν επιτακτικό λόγο για εφαρμογή. Για παράδειγμα, παρέχοντας ένα Λίστα διεπαφή σε έναν πίνακα Hash δεν έχει νόημα επειδή δεν υπάρχει έννοια της τάξης σε έναν πίνακα Hash. Ομοίως, δεν υπάρχει Χάρτης διεπαφή για μια συνδεδεμένη λίστα επειδή μια λίστα δεν έχει καμία έννοια της αναζήτησης πίνακα.

Ας ασκήσουμε τώρα το Λίστα διεπαφή λειτουργώντας σε συγκεκριμένες εφαρμογές που εφαρμόζουν το Λίστα διεπαφή, το Λίστα Array, και το Συνδεδεμένη λίστα. Ο παρακάτω κώδικας είναι παρόμοιος με το προηγούμενο παράδειγμα, αλλά εκτελεί πολλά Λίστα λειτουργίες.

εισαγωγή java.util.collections. *; δημόσια τάξη ListTest {// Statics public static void main (String [] args) {System.out.println ("List Test"); // Δημιουργήστε μια συλλογή ArrayList list = new ArrayList (); // Προσθήκη String [] toys = {"Shoe", "Ball", "Frisbee"}; list.addAll (Arrays.toList (παιχνίδια)); // Sizing System.out.println ("Η λίστα δημιουργήθηκε" + ", size =" + list.size () + ", isEmpty =" + list.isEmpty ()); // Επανάληψη χρησιμοποιώντας ευρετήρια. System.out.println ("Λίστα επανάληψης (χωρίς ταξινόμηση):"); για (int i = 0; i <list.size (); i ++) System.out.println ("" + list.get (i)); // Αντίστροφη επανάληψη χρησιμοποιώντας ListIterator System.out.println ("Λίστα επανάληψης (αντίστροφη):"); ListIterator iterator = list.listIterator (list.size ()); ενώ (iterator.hasPre sebelumnya ()) System.out.println ("" + iterator.pre sebelumnya ()); // Κατάργηση list.remove (0); list.clear (); }} 

Όπως με το πρώτο παράδειγμα, είναι απλό να ανταλλάξετε μια εφαρμογή για μια άλλη. Μπορείτε να χρησιμοποιήσετε ένα Συνδεδεμένη λίστα αντί για Λίστα Array απλά αλλάζοντας τη γραμμή με το Λίστα Array κατασκευαστής. Ομοίως, μπορείτε να χρησιμοποιήσετε ένα Διάνυσμα, το οποίο υποστηρίζει τώρα το Λίστα διεπαφή.

Όταν αποφασίζετε μεταξύ αυτών των δύο εφαρμογών, θα πρέπει να εξετάσετε εάν η λίστα είναι ασταθής (αυξάνεται και συρρικνώνεται συχνά) και εάν η πρόσβαση είναι τυχαία ή ταξινομημένη. Οι δικές μου δοκιμές έδειξαν ότι το Λίστα Array γενικά ξεπερνά το Συνδεδεμένη λίστα και το νέο Διάνυσμα.

Παρατηρήστε πώς προσθέτουμε στοιχεία στη λίστα: χρησιμοποιούμε το addAll μέθοδος και τη στατική μέθοδο Arrays.toList. Αυτή η στατική μέθοδος είναι μία από τις πιο χρήσιμες μεθόδους χρησιμότητας στο πλαίσιο Συλλογές επειδή επιτρέπει σε κάθε πίνακα να εμφανίζεται ως Λίστα. Τώρα ένας πίνακας μπορεί να χρησιμοποιηθεί οπουδήποτε a Συλλογή απατείται.

Παρατηρήστε ότι επαναλαμβάνω μέσω της λίστας μέσω ενός ευρετηριασμένου αξεσουάρ, παίρνω, και το Λίστα επαναληπτών τάξη. Εκτός από την αντίστροφη επανάληψη, το Λίστα επαναληπτών Το μάθημα σας επιτρέπει να προσθέσετε, να αφαιρέσετε και να ορίσετε οποιοδήποτε στοιχείο στη λίστα στο σημείο που αναφέρεται από το Λίστα επαναληπτών. Αυτή η προσέγγιση είναι αρκετά χρήσιμη για το φιλτράρισμα ή την ενημέρωση μιας λίστας σε κάθε στοιχείο.

Η τελευταία βασική διεπαφή στο Java Συλλογές Πλαίσιο είναι η Χάρτης. Αυτή η διεπαφή υλοποιείται με δύο νέες συγκεκριμένες υλοποιήσεις, το Χάρτης δέντρου και το HashMap. ο Χάρτης δέντρου είναι μια ισορροπημένη εφαρμογή δέντρου που ταξινομεί τα στοιχεία ανά κλειδί.

Ας απεικονίσουμε τη χρήση του Χάρτης διεπαφή με ένα απλό παράδειγμα που δείχνει πώς να προσθέσετε, να ζητήσετε και να διαγράψετε μια συλλογή. Αυτό το παράδειγμα, το οποίο χρησιμοποιεί το HashMap τάξη, δεν διαφέρει πολύ από το πώς χρησιμοποιήσαμε το Hashtable πριν από το ντεμπούτο του πλαισίου Συλλογές. Τώρα, με την ενημέρωση του Hashtable για να υποστηρίξει το Χάρτης διεπαφή, μπορείτε να αλλάξετε τη γραμμή που δημιουργεί το HashMap και αντικαταστήστε το με ένα παράδειγμα του Hashtable.

$config[zx-auto] not found$config[zx-overlay] not found