Διαφορά μεταξύ του HashMap και του Hashtable στην Java

Συγγραφέας: Laura McKinney
Ημερομηνία Δημιουργίας: 2 Απρίλιος 2021
Ημερομηνία Ενημέρωσης: 5 Ενδέχεται 2024
Anonim
Рефакторинг: switch vs if-else vs enum vs HashMap [Шаблон "Команда"]
Βίντεο: Рефакторинг: switch vs if-else vs enum vs HashMap [Шаблон "Команда"]

Περιεχόμενο


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

Ας δούμε στο διάγραμμα σύγκρισης που φαίνεται παρακάτω για να μάθετε μερικές ακόμη διαφορές μεταξύ του HashMap και του Hashtable.


  1. Συγκριτικό διάγραμμα
  2. Ορισμός
  3. Βασικές διαφορές
  4. Ομοιότητες
  5. συμπέρασμα

Συγκριτικό διάγραμμα

Βάση σύγκρισηςHashMapHashtable
Εφαρμογή / ΕπέκτασηΗ κλάση HashMap υλοποιεί τη διεπαφή χάρτη και επεκτείνει μια κλάση AbstractMap.Το Hashtable επεκτείνει την κλάση του λεξικού Legacy, αλλά είναι ανασχεδιασμένο και τώρα υλοποιεί και το interface του Map.
ΣυγχρονισμόςΤο HashMap είναι ασύγχρονη και, ως εκ τούτου, το αντικείμενο HashMap δεν είναι ασφαλές με σπείρωμα.Το Hashtable είναι συγχρονισμένο και ως εκ τούτου το αντικείμενο του Hashtable είναι ασφαλές για τα νήματα.
Κλειδιά / ΤιμήΈνα κλειδί μπορεί να επιστρέψει το Null μόνο μία φορά, αλλά μια τιμή μπορεί να επιστρέψει το Null σε οποιοδήποτε χρονικό διάστημα.Ένα κλειδί δεν μπορεί να επιστρέψει το Null καθώς χρησιμοποιείται για να αποκτήσει τον κωδικό κατακερματισμού που θα χρησιμοποιηθεί ως ευρετήριο του πίνακα hash, ούτε μια τιμή μπορεί να επιστρέψει Null.
Προεπιλεγμένη αρχική χωρητικότηταΗ προεπιλεγμένη αρχική χωρητικότητα του HashMap είναι 16.Η προεπιλεγμένη αρχική χωρητικότητα του Hashtable είναι 11.
ΤράβηγμαΤο HashMap διέρχεται από το Iterator.Όπως και το Hashtable κατηγορίας χάρτη, δεν υποστηρίζει άμεσα το Iterator για το πέρασμα και ως εκ τούτου χρησιμοποιεί τον Enumerator.


Ορισμός του HashMap

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

/ * K αντιπροσωπεύει το κλειδί και το V αντιπροσωπεύει την τιμή * / class HashMap / * Κατασκευαστές της κλάσης HashMap * / HashMap () HashMap (Χάρτης <; επεκτείνει K, επεκτείνει V> m) HashMap (int χωρητικότητα) HashMap (int χωρητικότητα, float fillRatio)

Ο πρώτος κατασκευαστής είναι ένας προεπιλεγμένος κατασκευαστής που αρχικοποιεί ένα κενό αντικείμενο του HashMap με προεπιλεγμένη χωρητικότητα 16 και προεπιλεγμένη αναλογία φόρτωσης 0,75. Ο δεύτερος κατασκευαστής προετοιμάζει το χάρτη κατακερματισμού με την τιμή m. Ο τρίτος κατασκευαστής δημιουργεί ένα χάρτη κατακερματισμού με την αρχική χωρητικότητα που αντιστοιχεί στην τιμή που παρέχεται στο όρισμα "χωρητικότητα". Ο τέταρτος κατασκευαστής προετοιμάζει χάρτη κατακερματισμού με αναλογία χωρητικότητας και πλήρωσης που παρέχεται στις παραμέτρους. ας μάθουμε τώρα πώς να τροφοδοτήσουμε τις καταχωρήσεις σε ένα χάρτη κατακερματισμού.

Hashmap hm = νέος χάρτης Hash (); hm.put ("Ajay", 275). hm.put ("Vijay", 250). hm.put ("Jonny", 150). hm.put ("Ιορδανία", 200). System.out.ln (hm); / * εξόδου * / {Vijay = 250, Jonny = 150, Ajay = 275, Ιορδανία = 200}

Στον παραπάνω κώδικα, μπορείτε να δείτε ότι δημιούργησα ένα κενό αντικείμενο HashMap hm με προεπιλεγμένη αρχική χωρητικότητα και προεπιλεγμένη αναλογία πλήρωσης. Στη συνέχεια, εισήγαγα τέσσερις καταχωρίσεις στο χάρτη κατακερματισμού με τη χρήση της μεθόδου put (K, V) που χαρτογραφεί το κλειδί στην τιμή. Μπορείτε να παρατηρήσετε ότι οι καταχωρίσεις δεν εκτυπώνονται σε μια ακολουθία που τις τροφοδοτείτε επειδή η εντολή εισαγωγής δεν είναι σταθερή. Τώρα, εξετάστε μια υπόθεση που έχετε ήδη μια εγγραφή στο χάρτη κατακερματισμού και στη συνέχεια προσπαθείτε να εισαγάγετε put (K1, V5), δηλ. προσπαθείτε να χαρτογραφήσετε το ίδιο κλειδί με διαφορετική τιμή. Στη συνέχεια, η μέθοδος τερματισμού θα αντικαταστήσει την παλιά τιμή V1 με τη νέα τιμή V2 και θα επιστρέψει την παλιά τιμήV1, διαφορετικά εάν δεν προσπαθήσουμε ποτέ να αντικαταστήσουμε την τιμή ενός κλειδιού τότε η μέθοδος put επιστρέφει Null για αυτό το κλειδί.

Ορισμός του Hashtable

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

/ * K καθορίζει το κλειδί και το V καθορίζει την τιμή που σχετίζεται με το κλειδί * / class Hashtable / * κατασκευαστές Hashtable * / Hashtable () Hashtable (int μέγεθος) Hashtable (int μέγεθος, float fillRatio) Hashtable (Χάρτης <επεκτείνει K,

Στον παραπάνω κώδικα, ο πρώτος κατασκευαστής είναι ένας προεπιλεγμένος κατασκευαστής που δημιουργεί ένα κενό αντικείμενο μιας κατηγορίας Hashtable, το προεπιλεγμένο μέγεθος του είναι 11 και ο λόγος προεπιλεγμένης πληρότητας είναι 0,75. Ο δεύτερος κατασκευαστής δημιουργεί έναν πίνακα κατακερματισμού με το μέγεθος που αντιστοιχεί στην τιμή που παρέχεται στην παράμετρο "μέγεθος". Ο τρίτος κατασκευαστής δημιουργεί ένα πίνακα κατακερματισμού με αναλογία μεγέθους και πλήρωσης που παρέχεται στην παράμετρο. Ο τέταρτος κατασκευαστής προετοιμάζει τον πίνακα κατακερματισμού με την τιμή m. Ας μάθουμε τώρα πώς να εισαγάγουμε το ζεύγος στον πίνακα κατακερματισμού.

Hashtable ht = νέο Hashtable (); ht.put (νέο hashCode (2), 275). ht.put (νέο hashCode (12), 250). ht.put (νέο hashCode (16), 150). ht.put (νέο hashCode (8), 200). System.out.ln (ht); / * εξόδου * / {12 = 250, 16 = 150, 2y = 275, 8 = 200}

Στον παραπάνω κώδικα, δημιούργησα ένα κενό αντικείμενο του Hashtable και εισήγαγε τέσσερις καταχωρήσεις χρησιμοποιώντας τη μέθοδο put (). Μέθοδος εσωτερικής θέσης έχω καλέσει hashCode () που υπολογίζει και επιστρέφει την τιμή του κώδικα κατακερματισμού που θα ενεργήσει ως τιμή δείκτη για το αντικείμενο εισαγωγής. Όπως μπορείτε να δείτε, δεν αναφέρθηκα το μέγεθος του πίνακα hash, έτσι από προεπιλογή θα είναι 11. Εδώ επίσης, η σειρά εισαγωγής δεν διατηρείται και επομένως, όταν οι καταχωρήσεις ED δεν εμφανίζονταν διαδοχικά, τροφοδοτήθηκε.

  1. Το HashMap υλοποιεί Χάρτης διεπαφή και επεκτείνει μια αφηρημένη τάξη, AbstractMap ενώ το Hashtable επεκτείνει την αφηρημένη τάξη Λεξικό, η οποία είναι επίσης μια κλάση Legacy, που αργότερα ανασχεδιάστηκε για να υλοποιηθεί Χάρτης διεπαφή.
  2. Το αντικείμενο HashMap είναι ασύγχρονη δηλ. πολλαπλά νήματα μπορούν να λειτουργούν σε αυτό ταυτόχρονα και ως εκ τούτου, αντικειμένων δεν είναι ασφαλές νήμα. Από την άλλη πλευρά, τα αντικείμενα του Hashtable είναι συγχρονισμένο δηλαδή εάν ένα νήμα θέλει να λειτουργήσει σε ένα αντικείμενο Hashtable, πρέπει να αποκτήσει μια κλειδαριά πάνω σε αυτό το αντικείμενο έτσι ώστε κανένα άλλο νήμα να μην μπορεί να έχει πρόσβαση σε αυτό το αντικείμενο και ως εκ τούτου είναι ασφαλές νήμα.
  3. Στο κλειδί HashMap μπορεί να επιστρέψει Μηδενίστε μόνο μία φορά, και η αξία μπορεί να επιστρέψει Null πολλές φορές. Από την άλλη πλευρά, ένα κλειδί δεν μπορεί ποτέ να επιστρέψει το Null όπως χρησιμοποιείται για την απόκτηση της τιμής κώδικα κατακερματισμού που χρησιμοποιείται ως ευρετήριο για την αποθήκευση ζεύγος και ούτε μια τιμή μπορεί να επιστρέψει Null.
  4. Η προεπιλεγμένη χωρητικότητα ενός πίνακα κατακερματισμού στην κλάση HashMap είναι 16 ενώ η προεπιλεγμένη χωρητικότητα ενός πίνακα κατακερματισμού στο Hashtable είναι 11.
  5. ο Iterator μπορεί να διασχίσει καταχωρήσεις Hashmap. Από την άλλη πλευρά, το Hashtable δεν υποστηρίζει άμεσα τον Iterator και ως εκ τούτου, γενικά Enumerator χρησιμοποιείται για την μετακίνηση των καταχωρήσεων στο Hashtable.

Ομοιότητες:

  • Τα HashMap και Hashtable χρησιμοποιούν και τη δομή δεδομένων του hash table.
  • Το HashMap και το Hashtable εφαρμόζουν και τα δύο Χάρτης διεπαφή
  • Η σειρά εισαγωγής δεν διατηρείται τόσο σε HashMap όσο και σε Hashtable και με βάση τον κωδικό κατακερματισμού που αποκτήθηκε χρησιμοποιώντας τα πλήκτρα.
  • Στο HashMap και στο Hashtable, πρέπει να είναι κλειδιά μοναδικός ενώ οι τιμές μπορούν να είναι αντίγραφο.
  • HashMap και Hashtable μπορούν να περιέχουν και τα δύο ετερογενή αντικείμενα και για τα δύο πλήκτρα και τις τιμές.
  • HashMap και Hashtable, και τα δύο εργαλεία Serializable και Κλωνοποιήσιμο διασυνδέσεις, αλλά όχι, τυχαία πρόσβαση.
  • Το HashMap και το Hashtable έχουν και την προεπιλεγμένη αναλογία πλήρωσης 0.75.
  • Τα HashMap και Hashtable είναι τα καλύτερα για ανάκτηση ή ερευνητικός λειτουργίες.

Συμπέρασμα:

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