Când învățați o nouă limbă de computer, unul dintre primele lucruri pe care le întrebați este cum să lucrați cu grupuri mari de date. Acest subiect este adesea acoperit de subiectul "Structuri de date". Dacă sapa mai adânc, trebuie să veniți în jurul subiectelor cum ar fi listele legate, cozi, stive și copaci binari printre multe alte structuri de date. În Java, aceste structuri fac parte din Java Collections Framework. O colecție nu este altceva decât un tip de structură de date care se referă la o grupare de elemente de date multiple și Java Collections Framework standardizează modul în care sunt manipulate aceste grupuri de obiecte. De fapt, cadrul colecțiilor a fost conceput pentru a îndeplini mai multe obiective.
Întregul cadru de colecții este proiectat în jurul unui set de interfețe standard. Mai multe implementări standard, cum ar fi LinkedList, HashSet și TreeSet, sunt furnizate de aceste interfețe pe care le puteți oferi. În plus, puteți implementa și colecția dvs. dacă alegeți. Cu toate acestea, în plus față de colecții, cadrul definește mai multe interfețe și clase ale hărților. Java conține trei implementări hartă cu scop general - HashMap, TreeMap și LinkedHashMap - care stochează perechi cheie / valoare. Deși hărțile nu sunt colecții tehnice, ele sunt pe deplin integrate cu colecțiile. De fapt, hărțile se concentrează asupra grupurilor de asociere dintre obiecte. Acest articol rezumă diferențele cheie dintre HashMap și HashSet.
HashMap este cea mai frecvent folosită implementare a interfeței Map care oferă o hartă de bază cheie / valoare unde elementele sunt neordonate. Utilizează o valoare specială numită cod hash, în loc de o căutare lentă a cheii. Codul hash este o modalitate de a lua informații în obiectul în cauză și de ao transforma într-un "relativ unic" int pentru acest obiect. Funcționează pur și simplu pe principiul hashing, ceea ce înseamnă că folosește o funcție hash pentru a mapa valorile de identificare. La fel ca Vector și Stack au înlocuitori în ArrayList și LinkedList, Hashtable are un înlocuitor în HashMap. Acesta extinde AbstractMap pentru a implementa interfața Map folosind o reprezentare internă Hashtable. Și similar cu alte implementări cu scop general, HashMap acceptă metodele opționale ale Map, permite valori nula și nu este sincronizat.
HashSet este unul dintre membrii Java Collections Framework care implementează interfața Set, susținută de o tabelă hash care este, de fapt, o instanță HashMap. După cum sugerează și numele, acesta este implementat de o tabelă hash, o matrice în care elementele sunt stocate într-o poziție derivată din conținutul lor. Spre deosebire de o hartă, setul este exact o colecție cu exact aceeași interfață, deci nu există nicio funcționalitate suplimentară, cum ar fi există două liste diferite. HashSet utilizează o funcție hash care este proiectată special pentru căutări rapide. Este o colecție neordonată de obiecte unice care nu pot stoca valori duplicate. HashSet extinde clasa AbstractSet care implementează interfața Set. Totuși, HashSet nu definește alte metode suplimentare decât cele furnizate de superclasele și interfețele sale.
HashMap este cea mai frecvent folosită implementare a interfeței Map care oferă o hartă de bază cheie / valoare unde elementele sunt neordonate. Funcționează pur și simplu pe principiul hashing, ceea ce înseamnă că folosește o funcție hash pentru a mapa valorile de identificare. HashSet, pe de altă parte, este unul dintre membrii Java Collections Framework care implementează interfața Set, susținută de o tabelă hash care este de fapt o instanță HashMap. Pur și simplu, HashMap implementează interfața Map, în timp ce HashSet implementează interfața Set.
HashSet creează o colecție care utilizează o tabelă hash pentru stocare. Tabelul Hash stochează informații utilizând o metodă numită hash. HashSet utilizează o funcție hash, care este special creată pentru căutări rapide, pentru a stoca elemente sau valori. Cea mai mare parte a funcționalității HashSet este furnizată prin supraplasa AbstractCollection și AbstractSet, pe care HashSet o distribuie împreună cu TreeSet. HashMap extinde AbstractMap pentru a implementa interfața Map folosind o reprezentare internă Hashtable. Ambele clase nu sunt sincronizate, ceea ce înseamnă că nu sunt potrivite pentru operațiunile de siguranță.
Deoarece hartă nu acceptă chei duplicat, HashMap nu permite chei duplicat, dar este permis să aibă valori duplicate. Acest lucru înseamnă că pot exista valori duplicate în HashMap, dar puteți utiliza colecția ca valoare pentru unele chei. Fiecare cheie trebuie să fie unică într-un HashMap și nu poate fi permisă o singură cheie să aibă mai mult de o valoare. HashSet, pe de altă parte, nu poate avea elemente duplicate prin simpla definiție a unui Set, ceea ce înseamnă că nu puteți stoca valori duplicate în HashSet. HashMap permite doar o singură cheie nulă, dar permite orice număr de valori nula, în timp ce HashSet permite doar o singură valoare nulă.
HashMap funcționează pe principiul hash care înseamnă că folosește o funcție hash pentru a hărți valorile de identificare intern folosind algoritmul hashing pentru a permite recuperarea ușoară. Un mecanism de hashing întotdeauna întoarce același hashCode () atunci când este aplicat aceluiași obiect. HashSet, pe de altă parte, folosește intern HashMap ca structură de date pentru a adăuga sau a stoca obiecte. Aceasta înseamnă că atunci când un obiect al HashSet este creat, acesta va crea un obiect al HashMap.
Deși atât HashMap, cât și HashSet nu sunt sincronizate, ceea ce înseamnă că nu sunt potrivite pentru operațiile în condiții de siguranță a thread-urilor și sunt construcții complet diferite, ele oferă performanțe în timp constante pentru operații de bază, cum ar fi adăugarea, eliminarea elementelor etc. În timp ce HashMap este o implementare generală a interfața hărții care stochează perechi cheie / valoare, HashSet este o implementare a interfeței Set. Un HashSet utilizează un HashMap pentru a-și sprijini implementarea. Un HashMap, totuși, folosește principiul hashing și îl folosește pentru a vâna rapid cheia.