Cadrul de colecții Java oferă un set de clase de colectare. Fiecare clasă are propriile puncte forte și puncte slabe. Unele dintre clase oferă implementări complete care pot fi utilizate așa cum este. Altele sunt abstracte care oferă implementări scheletice care sunt folosite ca puncte de plecare pentru crearea colecțiilor. Implementările de colectare utilizează cadrul sincronizat pentru a furniza clase sincronizate, în caz contrar implementările sunt nesincronizate. Mai multe clase oferă implementări ale interfeței hărții.
Platforma Java conține trei implementări generale de hartă: HashMap, TreeMap și LinkedHashMap. HashMap și Hashtable sunt două colecții în Java utilizate pentru a stoca perechi cheie / valoare într-o tabelă hash. Hashtable este o hartă sincronizată și HashMap este o hartă nesincronizată. Cu toate acestea, dacă aveți nevoie să utilizați o hartă sincronizată, un Hashtable este mai rapid decât utilizarea unui HashMap într-un ambalaj sincronizat. Ambele sunt colecții bazate pe hash în Java, dar au cota lor echitabilă de diferențe. Subliniem câteva diferențe majore dintre cele două, pentru a vă ajuta să înțelegeți mai bine termenii.
HashMap este o implementare Map bazată pe o tabelă hash care oferă performanță în timp constant pentru introducerea și localizarea perechilor. Clasa HashMap oferă o implementare a hărților care se bazează pe o structură de date Hashtable. Această implementare acceptă toate operațiile Map și permite numeroase valori nula, dar numai o singură cheie nulă. Utilizează perechi cheie / valoare pentru a stoca valori într-o tabelă hash. Este o hartă nesincronizată, ceea ce înseamnă că nu este sigură pentru fire și nu poate fi partajată între mai multe fire fără sincronizarea corespunzătoare.
Spre deosebire de HashMap, Hashtable este o hartă sincronizată și este thread-safe, ceea ce înseamnă că poate fi împărțit între mai multe fire. În Hashtable, specificați un obiect care poate fi folosit ca o cheie și valoarea care se potrivește cu cheia. O hashtable hartă tastele valorilor cu ajutorul unei funcții hash. Java oferă această funcție sub forma metodei hashcode () a obiectului, care suprascrie clasele pentru a furniza codurile hash corespunzătoare. Spre deosebire de HashMap, Hashtable nu acceptă valori nula și chei nulă deoarece există o verificare nulă în implementarea metodei put a Hashtable.
Ambele sunt colecții bazate pe hash în Java folosite pentru a stoca date în perechi cheie / valoare. HashMap este o implementare Map bazată pe o tabelă hash care oferă performanță în timp constant pentru introducerea și localizarea perechilor. Performanța poate fi ajustată cu ajutorul constructorilor care vă permit să setați capacitatea și factorul de încărcare al tabelului hash. Hashtable de bază este destul de similar cu HashMap, chiar și în jos numele de metode. Se stochează pereche cheie / valoare în tabelul hash. În Hashtable, specificați un obiect care poate fi folosit ca o cheie și valoarea care se potrivește cu cheia.
Atât HashMap cât și Hashtable folosesc tehnici de hashing pentru a stoca valori pe baza cheii. Ca și HashMap, Hashtable utilizează perechi cheie / valoare pentru a stoca valori într-o tabelă hash. Cu toate acestea, diferența majoră dintre cele două este sincronizarea. HashMap este o hartă nesincronizată, în timp ce Hashtable este o hartă sincronizată. Acest lucru înseamnă că HashMap nu este sigură pe fir și nu poate fi partajat între mai multe fire fără un cod de sincronizare corespunzător. Dimpotrivă, Hashtable este sigură pentru fire și poate fi împărțită între mai multe fire. Hashtable este mai rapid decât utilizarea unui HashMap într-un pachet sincronizat, dacă aveți nevoie să utilizați o hartă sincronizată.
Clasa HashMap oferă o implementare a hărților care se bazează pe o structură de date Hashtable. Această implementare acceptă toate operațiile Map și permite numeroase valori nula, dar numai o singură cheie nulă, astfel încât să poată menține proprietățile cheii unice. Cu toate acestea, nu oferă garanții privind ordinea în care sunt stocate intrările. Hashtable, pe de altă parte, hărți cheile la valori cu ajutorul unei funcții hash. Spre deosebire de HashMap, Hashtable nu acceptă valori nula și chei nulă deoarece există o verificare nulă în implementarea metodei put a Hashtable.
Deoarece HashMap nu este o hartă sincronizată, este mult mai rapidă și mai bună decât un Hashtable în termeni de performanță și, de fapt, utilizează mai puțină memorie decât Hashtable. Deși sunt practic identice, Hashtable este puțin mai lent decât un HashMap, dar mai rapid decât un HashMap sincronizat. În mod inerent, nu este sigur să utilizați Hashtable cu acces multietajat deoarece numai metodele sunt sincronizate. Hashtable este omologul sincronizat cu HashMap. Obiectele nesincronizate funcționează mai bine în comparație cu obiectele sincronizate, la fel ca un Hashtable, performanțe mai bune într-un singur mediu filetat.
Clasa HashMap vă oferă o hartă nesortată și neordonată. Deci, atunci când aveți nevoie de o hartă și nu vă pasă de ordinea în care intrările sunt stocate, atunci HashMap este calea de parcurs.
Hashtable, la fel ca Vector, a fost din vremurile preistorice din Java. La fel ca Vector este o corespondent sincronizat cu arrayList mai moderne și mai avansate, Hashtable este omologul sincronizat cu HashMap. Cu toate acestea, o clasă nu poate fi sincronizată, deci atunci când spunem că Hashtable este o hartă sincronizată, înseamnă că metodele-cheie ale clasei sunt sincronizate.
În timp ce ambele sunt practic identice, diferența constă în modul în care sunt sincronizate și în modul în care acestea sunt realizate. HashMap funcționează mai bine într-un mediu cu filet multiplu, în timp ce Hashtable funcționează mai bine într-un singur mediu filetat.