Quando si impara un nuovo linguaggio informatico, una delle prime cose che si tende a chiedere è come lavorare con grandi gruppi di dati. Questo argomento è spesso trattato sotto l'argomento "Strutture dati". Se si scava più in profondità, è necessario aggirare argomenti come elenchi collegati, code, stack e alberi binari tra molte altre strutture di dati. In Java, queste strutture fanno parte di Java Collections Framework. Una raccolta non è altro che un tipo di struttura dati che fa riferimento a un raggruppamento di più elementi di dati e Java Collections Framework standardizza il modo in cui questi gruppi di oggetti vengono gestiti. In effetti, il framework delle collezioni è stato progettato per soddisfare diversi obiettivi.
L'intero framework delle collezioni è progettato attorno a una serie di interfacce standard. Diverse implementazioni standard come LinkedList, HashSet e TreeSet sono fornite da queste interfacce che è possibile. Inoltre, se lo desideri, puoi anche implementare la tua collezione personale. Tuttavia, oltre alle collezioni, il framework definisce diverse interfacce e classi di mappe. Java contiene tre implementazioni di mappe generiche - HashMap, TreeMap e LinkedHashMap - che memorizzano coppie chiave / valore. Sebbene le mappe non siano tecnicamente collezioni, sono completamente integrate con le collezioni. In effetti, le mappe si concentrano su gruppi di associazioni tra oggetti. Questo articolo riepiloga le principali differenze tra HashMap e HashSet.
HashMap è l'implementazione più comunemente utilizzata dell'interfaccia Mappa che fornisce una mappa chiave / valore di base in cui gli elementi non sono ordinati. Usa un valore speciale chiamato codice hash, invece di una ricerca lenta della chiave. Il codice hash è un modo per prendere informazioni nell'oggetto in questione e trasformarlo in un "relativamente unico" int per quell'oggetto. Funziona semplicemente sul principio di hashing, il che significa che usa una funzione hash per mappare i valori di identificazione. Proprio come Vector e Stack hanno le loro sostituzioni in ArrayList e LinkedList, Hashtable ha una sostituzione in HashMap. Estende AbstractMap per implementare l'interfaccia Mappa usando una rappresentazione interna di Hashtable. E simile ad altre implementazioni generiche, HashMap supporta i metodi opzionali di Map, consente valori nulli e non è sincronizzato.
HashSet è uno dei membri di Java Collections Framework che implementa l'interfaccia Set, supportata da una tabella hash che è in effetti un'istanza di HashMap. Come suggerisce il nome, è implementato da una tabella hash, una matrice in cui gli elementi sono memorizzati in una posizione derivata dal loro contenuto. A differenza di una mappa, Set è esattamente una collezione con esattamente la stessa interfaccia, quindi non ci sono funzionalità extra come c'è con due elenchi diversi. HashSet utilizza una funzione di hashing che è stata progettata specificamente per ricerche rapide. È una raccolta non ordinata di oggetti unici che non possono memorizzare valori duplicati. HashSet estende la classe AbstractSet che implementa l'interfaccia Set. Tuttavia, HashSet non definisce alcun metodo aggiuntivo oltre a quelli forniti dalle sue superclassi e interfacce.
HashMap è l'implementazione più comunemente utilizzata dell'interfaccia Mappa che fornisce una mappa chiave / valore di base in cui gli elementi non sono ordinati. Funziona semplicemente sul principio di hashing, il che significa che usa una funzione hash per mappare i valori di identificazione. HashSet, d'altra parte, è uno dei membri di Java Collections Framework che implementa l'interfaccia Set, supportata da una tabella hash che è in effetti un'istanza di HashMap. In poche parole, HashMap implementa l'interfaccia Map, mentre HashSet implementa l'interfaccia Set.
HashSet crea una raccolta che utilizza una tabella hash per l'archiviazione. La tabella hash memorizza le informazioni utilizzando un metodo chiamato hashing. HashSet utilizza una funzione di hashing, specificatamente progettata per ricerche rapide, per memorizzare elementi o valori. La maggior parte delle funzionalità di HashSet è fornita attraverso la superclasse AbstractCollection e AbstractSet, che condivide con HashSet TreeSet. HashMap estende AbstractMap per implementare l'interfaccia Map utilizzando una rappresentazione Hashtable interna. Entrambe le classi non sono sincronizzate, il che significa che non sono adatte per operazioni thread-safe.
Poiché Map non supporta chiavi duplicate, HashMap non consente chiavi duplicate ma è consentito avere valori duplicati. Ciò significa che possono esistere valori duplicati in HashMap ma è possibile utilizzare la raccolta come valore rispetto a una chiave. Ogni chiave deve essere univoca in una HashMap e una singola chiave non può avere più di 1 valore. HashSet, d'altra parte, non può avere elementi duplicati con la semplice definizione di un Set, il che significa che non puoi memorizzare valori duplicati in HashSet. HashMap consente solo una chiave nulla ma consente un numero qualsiasi di valori nulli, mentre HashSet consente solo un valore nullo.
HashMap funziona con il principio di hashing, il che significa che usa una funzione hash per mappare internamente i valori di identificazione usando l'algoritmo di hashing per consentire un facile recupero. Un vero meccanismo di hashing restituisce sempre lo stesso hashCode () quando applicato allo stesso oggetto. HashSet, d'altra parte, utilizza internamente HashMap come struttura di dati di supporto per aggiungere o memorizzare oggetti. Ciò significa che quando viene creato un oggetto di HashSet, creerà un oggetto di HashMap.
Sebbene sia HashMap che HashSet non siano sincronizzati, il che significa che non sono adatti per operazioni thread-safe e sono costrutti completamente diversi, forniscono prestazioni costanti nel tempo per operazioni di base come l'aggiunta, la rimozione di elementi ecc. HashMap è un'implementazione general-purpose di l'interfaccia Mappa che memorizza coppie chiave / valore, HashSet è un'implementazione dell'interfaccia Set. Un HashSet usa una HashMap per supportare la sua implementazione. Una HashMap, tuttavia, usa il principio di hashing e la usa per cercare rapidamente la chiave.