Diferența dintre HashMap și Hashtable în Java

Autor: Laura McKinney
Data Creației: 2 Aprilie 2021
Data Actualizării: 5 Mai 2024
Anonim
Diferența dintre HashMap și Hashtable în Java - Tehnologie
Diferența dintre HashMap și Hashtable în Java - Tehnologie

Conţinut


HashMap și Hashtable, ambele sunt utilizate pentru a reprezenta o grup de obiecte care sunt reprezentate în pereche. Fiecare pereche se numește Intrare obiect. Colectie of Entries este referit de obiectul HashMap și Hashtable. Cheile dintr-o colecție trebuie să fie unice sau distincte. Diferența dintre HashMap și Hashtable este că HashMap implementează în special interfața Map, în timp ce Hashtable extinde clasa Dicționar (clasa moștenire), care este reengineered pentru a implementa interfața Map. Cealaltă diferență importantă este că obiectele HashMap sunt nesincronizate în timp ce, obiectele lui Hashtable sunt sincronizate.

Să vedem graficul de comparație prezentat mai jos pentru a afla alte diferențe între HashMap și Hashtable.

  1. Diagramă de comparație
  2. Definiție
  3. Diferențele cheie
  4. Asemănările
  5. Concluzie

Diagramă de comparație

Baza pentru comparațieHashMapHashtable
Implementați / ExtindețiClasa HashMap implementează interfața Map și extinde o clasă AbstractMap.Hashtable se extinde din clasa Dicționar Legacy, dar, este re-proiectat și acum implementează, de asemenea, interfața Map.
SincronizareHashMap este nesincronizat și, prin urmare, obiectul HashMap nu este în siguranță cu filet.Hashtable este sincronizat și, prin urmare, obiectul Hashtable este sigur în fire.
Taste / ValoareO cheie poate returna Null-ul o singură dată, dar o valoare poate returna Null orice număr de timp.O cheie nu poate returna Null, deoarece este folosită pentru a obține codul hash care va fi folosit ca un index al tabelului hash și nici o valoare nu poate returna Null.
Capacitate inițială implicităCapacitatea inițială implicită a HashMap este 16.Capacitatea inițială implicită a Hashtable este de 11.
pendulareHashMap este traversat de Iterator.Ca și clasa Map Hashtable nu acceptă în mod direct Iterator pentru parcurgere și, prin urmare, folosește Enumerator.


Definiția HashMap

HashMap este o clasă care implementează Hartă interfață și extinde AbstractMap clase folosește tabelul hash. Obiectul HashMap se referă la o colecție / set de pereche în care fiecare cheie este mapată la o anumită valoare. Tastele dintr-o colecție trebuie să fie unice, deoarece sunt folosite pentru a prelua valoarea. Pe de altă parte, valorile dintr-o colecție pot fi duplicate. Declarația clasei HashMap și a constructorilor clasei HashMapclass sunt următoarele:

/ * K reprezintă cheia, iar V reprezintă valoarea * / clasa HashMap / * Constructori ai clasei HashMap * / HashMap () HashMap (Harta <? Extinde K,? Extinde V> m) HashMap (int capacitate) HashMap (capacitate int, float fillRatio)

Primul constructor este un constructor implicit care inițializează un obiect gol al HashMap cu o capacitate implicită de 16 și un raport de umplere implicit de 0,75. Al doilea constructor inițializează harta hash cu valoarea lui m. Al treilea constructor creează o hartă hash cu capacitatea inițială corespunzătoare valorii furnizate în argumentul „capacitate”. Al patrulea constructor inițializează harta hash cu o capacitate și un raport de umplere furnizate în parametri. să învățăm acum cum să alimentăm intrările dintr-o hartă hash.


Hashmap hm = Hashmap new (); hm.put ("Ajay", 275); hm.put („Vijay”, 250); hm.put ("Jonny", 150); hm.put („Iordania”, 200); System.out.ln (hm); / * ieșire * / {Vijay = 250, Jonny = 150, Ajay = 275, Iordania = 200}

În codul de mai sus, puteți vedea că am creat un obiect HashMap gol hm cu capacitatea inițială implicită și raportul de umplere implicit. Apoi am inserat patru intrări în harta hash folosind metoda put (K, V) care mapează cheia valorii. Puteți observa că intrările nu sunt editate într-o secvență pe care le alimentați, deoarece ordinea de inserare nu este fixată. Acum, luați în considerare un caz în care aveți deja o intrare în harta hash și după aceea încercați să inserați put (K1, V5), adică încercați să mapați aceeași cheie cu o valoare diferită. Apoi, metoda put va înlocui vechea valoare V1 cu noua valoare V2 și va returna vechea valoare V1, în caz contrar, dacă nu încercăm niciodată să înlocuim valoarea unei chei, atunci metoda pune returnează Null pentru acea cheie.

Definiția Hashtable

Hashtable este o clasă care extinde Dicţionar clasa care este o clasă de moștenire și este reengineered pentru a implementa Hartă interfață. Hashtable folosește tabelul hash ca structură de date. Hashtable este similară cu HashMap, deoarece aici și obiectul Hashtable se referă la colecția de intrări în care fiecare intrare este o pereche de . Toate cheile dintr-o colecție trebuie să fie unice pe de altă parte, valorile pot fi duplicate. Tastele sunt utilizate în special pentru a obține valoarea codului hash care decide indexul, unde perechea va fi stocată într-un tabel hash. Într-un tabel hash, nici o cheie și nici o valoare nu poate returna indicatorul Null. Să vedem declarația clasei Hashtable și a constructorilor clasei hashtable.

/ * K specifică cheia, iar V specifică valoarea asociată cu cheia * / clasa Hashtable / * constructori de Hashtable * / Hashtable () Hashtable (int size) Hashtable (int size, float fillRatio) Hashtable (Harta <? extinde K,? se extinde V> m)

În codul de mai sus, primul constructor este un constructor implicit care creează un obiect gol dintr-o clasă Hashtable, dimensiunea sa implicită este 11 și raportul de umplere implicit este 0,75. Al doilea constructor creează un tabel hash cu dimensiunea corespunzătoare valorii furnizate în parametrul „size”. Al treilea constructor creează un tabel hash cu dimensiunea și raportul de umplere furnizate în parametru. Al patrulea constructor inițializează tabelul hash cu valoarea m. Să învățăm acum cum să introducem pereche în tabelul hash.

Hashtable ht = new Hashtable (); ht.put (nou hashCode (2), 275); ht.put (nou hashCode (12), 250); ht.put (nou hashCode (16), 150); ht.put (nou hashCode (8), 200); System.out.ln (ht); / * ieșire * / {12 = 250, 16 = 150,2y = 275, 8 = 200}

În codul de mai sus, am creat un obiect gol din Hashtable și am inserat patru intrări folosind metoda put (). În cadrul metodei put, am numit hashCode () care calculează și returnează valoarea codului hash, care va acționa ca valoarea index pentru obiectul de intrare. După cum puteți vedea, nu am menționat dimensiunea tabelului de hash, deci în mod implicit va fi 11. De asemenea, ordinea de inserare nu este păstrată și, prin urmare, când intrările ed nu au apărut în secvență, au fost alimentate.

  1. HashMap implementează Hartă interfață și extinde o clasă abstractă, AbstractMap în timp ce Hashtable extinde clasa abstractă Dicţionar, care este de asemenea o clasă Legacy, mai târziu reproiectată pentru implementare Hartă interfață.
  2. Obiectul HashMap este nesincronizate adică mai multe fire pot acționa asupra acestuia în același timp și, prin urmare, nu obiectele sunt în siguranță. Pe de altă parte, obiectele Hashtable sunt sincronizate adică dacă un thread vrea să opereze pe un obiect din Hashtable, trebuie să achiziționeze un blocaj pe acel obiect, astfel încât niciun alt thread să nu poată accesa acel obiect și, prin urmare, acesta este sigur.
  3. În HashMap cheia poate reveni Nul o singură dată, iar valoarea poate reveni Nul de mai multe ori. Pe de altă parte, o cheie nu poate întoarce niciodată Null, deoarece a fost obținută pentru a obține valoarea codului hash care este utilizată ca un index pentru stocarea perechea și nici o valoare nu pot întoarce Null.
  4. Capacitatea implicită a unei tabele hash din clasa HashMap este 16 întrucât, capacitatea implicită a unui tabel hash în Hashtable este 11.
  5. iterator poate traversa intrările Hashmap. Pe de altă parte, Hashtable nu suportă direct Iteratorul și, prin urmare, în general enumeratorul este utilizat pentru parcurgerea intrărilor din Hashtable.

asemănări:

  • HashMap și Hashtable folosesc ambele structuri de date masa de hash.
  • Ambele instrumente HashMap și Hashtable Hartă interfață
  • Comanda de inserție nu este păstrată atât în ​​HashMap cât și în Hashtable și pe baza codului hash obținut cu ajutorul tastelor.
  • În HashMap și Hashtable, tastele trebuie să fie unic în timp ce, valorile pot fi duplicată.
  • HashMap și Hashtable pot conține ambele obiecte eterogene atât pentru taste, cât și pentru valori.
  • HashMap și Hashtable, ambele instrumente serializabil și Cloneable interfețe dar nu, acces aleatoriu.
  • HashMap și Hashtable au un raport de umplere implicit 0.75.
  • HashMap și Hashtable ambele sunt cele mai bune pentru regăsire sau in cautarea operațiuni.

Concluzie:

HashMap are o performanță mai bună, deoarece obiectele sale sunt nesincronizate și mai multe fire pot opera pe el în același timp și, prin urmare, este mai rapid decât Hashtable.