Differenza tra HashMap e Hashtable

Il framework di collezioni Java fornisce un set di classi di raccolta. Ogni classe ha i suoi punti di forza e di debolezza. Alcune delle classi forniscono implementazioni complete che possono essere utilizzate così come sono. Altri sono astratti che forniscono implementazioni scheletriche che vengono utilizzate come punti di partenza per la creazione di collezioni. Le implementazioni di raccolta utilizzano la struttura del wrapper sincronizzato per fornire classi sincronizzate, altrimenti le implementazioni non sono sincronizzate. Diverse classi forniscono implementazioni dell'interfaccia della mappa.

La piattaforma Java contiene tre implementazioni di mappe generiche: HashMap, TreeMap e LinkedHashMap. HashMap e Hashtable sono due raccolte in Java utilizzate per memorizzare coppie chiave / valore in una tabella hash. Hashtable è una mappa sincronizzata e HashMap è una mappa non sincronizzata. Tuttavia, se è necessario utilizzare una mappa sincronizzata, un Hashtable è più veloce rispetto all'utilizzo di una HashMap in un wrapper sincronizzato. Entrambe sono raccolte basate su hash in Java, ma hanno una buona dose di differenze. Evidenziamo alcune differenze chiave tra i due per aiutarti a capire meglio i termini.

Cos'è HashMap?

HashMap è un'implementazione della mappa basata su una tabella hash che fornisce prestazioni costanti per l'inserimento e l'individuazione di coppie. La classe HashMap fornisce un'implementazione cartografica basata su una struttura dati Hashtable. Questa implementazione supporta tutte le operazioni della mappa e consente più valori null ma solo una chiave nulla. Usa coppie chiave / valore per memorizzare i valori in una tabella hash. È una mappa non sincronizzata che significa che non è thread-safe e non può essere condivisa tra più thread senza una corretta sincronizzazione.

Cos'è Hashtable?

A differenza di HashMap, Hashtable è una mappa sincronizzata ed è thread-safe, il che significa che può essere condivisa tra più thread. In Hashtable, si specifica un oggetto che può essere utilizzato come chiave e il valore associato alla chiave. Un Hashtable mappa le chiavi dei valori con l'aiuto di una funzione di hash. Java fornisce questa funzione sotto forma di metodo hashcode () di Object, che sostituisce le classi per fornire codici hash appropriati. A differenza di HashMap, Hashtable non supporta valori nulli e chiavi null in quanto esiste un controllo Null nell'implementazione del metodo put di Hashtable.

Differenza tra HashMap e Hashtable

  1. Nozioni di base su HashMap vs. tabella hash

Entrambe sono raccolte basate su hash in Java utilizzate per archiviare i dati in coppie chiave / valore. HashMap è un'implementazione della mappa basata su una tabella hash che fornisce prestazioni costanti per l'inserimento e l'individuazione di coppie. Le prestazioni possono essere regolate con l'uso di costruttori che consentono di impostare la capacità e il fattore di carico della tabella hash. L'hashtable di base è abbastanza simile a HashMap, anche in basso i nomi dei metodi. Memorizza la coppia chiave / valore nella tabella hash. In Hashtable, si specifica un oggetto che può essere utilizzato come chiave e il valore associato alla chiave.

  1. Sincronizzazione di HashMap vs. tabella hash

Sia HashMap che Hashtable utilizzano tecniche di hashing per memorizzare i valori in base alla chiave. Come HashMap, Hashtable utilizza coppie chiave / valore per memorizzare i valori in una tabella hash. Tuttavia, la differenza chiave tra i due è la sincronizzazione. HashMap è una mappa non sincronizzata mentre Hashtable è una mappa sincronizzata. Ciò significa che HashMap non è thread-safe e non può essere condiviso tra più thread senza un codice di sincronizzazione appropriato. Al contrario, Hashtable è thread-safe e può essere condiviso tra più thread. Hashtable è più veloce dell'utilizzo di HashMap in un wrapper sincronizzato, se è necessario utilizzare una mappa sincronizzata.

  1. Null Keys e Null Values ​​per HashMap vs. tabella hash

La classe HashMap fornisce un'implementazione cartografica basata su una struttura dati Hashtable. Questa implementazione supporta tutte le operazioni Map e consente più valori null ma solo una chiave nulla in modo che possa mantenere proprietà di chiave univoche. Tuttavia, non fornisce garanzie sull'ordine in cui sono memorizzate le voci. L'Hashtable, d'altra parte, mappa le chiavi ai valori con l'aiuto di una funzione di hash. A differenza di HashMap, Hashtable non supporta valori nulli e chiavi null in quanto esiste un controllo Null nell'implementazione del metodo put di Hashtable.

  1. Prestazioni di HashMap vs. tabella hash

Poiché HashMap non è una mappa sincronizzata, è molto più veloce e migliore di un Hashtable in termini di prestazioni e, di fatto, utilizza meno memoria di Hashtable. Sebbene siano praticamente identici, Hashtable è leggermente più lento di una HashMap ma più veloce di una HashMap sincronizzata. Intrinsecamente, non è sicuro usare Hashtable con accesso multithread perché solo i metodi sono sincronizzati. Hashtable è la controparte sincronizzata di HashMap. Gli oggetti non sincronizzati funzionano meglio se confrontati con oggetti sincronizzati, proprio come un Hashtable offre prestazioni migliori in un singolo ambiente con thread.

HashMap vs. Hashtable: grafico di confronto

 

Riepilogo di HashMap vs. tabella hash

La classe HashMap ti offre una mappa non ordinata e non ordinata. Quindi quando hai bisogno di una mappa e non ti interessa l'ordine in cui sono archiviate le voci, allora HashMap è la strada da percorrere.

Hashtable, proprio come Vector, è stato in tempi preistorici di Java. Proprio come Vector è una controparte sincronizzata della più moderna e avanzata ArrayList, Hashtable è la controparte sincronizzata di HashMap. Tuttavia, una classe non può essere sincronizzata, quindi quando diciamo che Hashtable è una mappa sincronizzata, significa che i metodi chiave della classe sono sincronizzati. 

Mentre entrambi sono praticamente identici, la differenza sta nel modo in cui sono sincronizzati e in che modo si comportano. HashMap offre prestazioni migliori in un ambiente con più thread, mentre Hashtable offre prestazioni migliori in un singolo ambiente con thread.