Differenze tra HashMap e Hashtable

1. Panoramica

In questo breve tutorial, ci concentreremo sulle differenze principali tra Hashtable e HashMap .

2. Hashtable e HashMap in Java

Hashtable e HashMap sono abbastanza simili: sono entrambe raccolte che implementano l' interfaccia Map .

Inoltre, i metodi put () , get () , remove () e containsKey () forniscono prestazioni a tempo costante O (1). Internamente, questi metodi funzionano sulla base di un concetto generale di hashing utilizzando bucket per l'archiviazione dei dati.

Nessuna delle classi mantiene l'ordine di inserimento degli elementi. In altre parole, il primo elemento aggiunto potrebbe non essere il primo elemento quando iteriamo sui valori.

Ma hanno anche alcune differenze che rendono uno migliore dell'altro in alcune situazioni. Diamo un'occhiata più da vicino a queste differenze.

3. Differenze tra Hashtable e HashMap

3.1. Sincronizzazione

In primo luogo, Hashtable è thread-safe e può essere condiviso tra più thread nell'applicazione.

D'altra parte, HashMap non è sincronizzato e non è possibile accedervi da più thread senza codice di sincronizzazione aggiuntivo. Possiamo usare Collections.synchronizedMap () per creare una versione thread-safe di una HashMap . Possiamo anche creare semplicemente un codice di blocco personalizzato o rendere il codice thread-safe utilizzando la parola chiave sincronizzata .

HashMap non è sincronizzato, quindi è più veloce e utilizza meno memoria di Hashtable . In genere, gli oggetti non sincronizzati sono più veloci di quelli sincronizzati in una singola applicazione a thread.

3.2. Valori nulli

Un'altra differenza è la gestione dei valori nulli . HashMap consente di aggiungere una voce con null come chiave e molte voci con null come valore. Al contrario, Hashtable non permette nulla affatto . Vediamo un esempio di null e HashMap :

HashMap map = new HashMap(); map.put(null, "value"); map.put("key1", null); map.put("key2", null);

Ciò si tradurrà in:

assertEquals(3, map.size());

Successivamente, vediamo come Hashtable è diverso:

Hashtable table = new Hashtable(); table.put("key", null);

Ciò si traduce in una NullPointerException . L'aggiunta di un oggetto con null come chiave comporta anche una NullPointerException :

table.put(null, "value");

3.3. Iterazione sugli elementi

HashMap utilizza Iterator per iterare sui valori, mentre Hashtable ha Enumerator per lo stesso. L' Iterator è un successore di Enumeratore che elimina i suoi pochi svantaggi. Ad esempio, Iterator ha un metodo remove () per rimuovere gli elementi dalle raccolte sottostanti.

L' iteratore è un iteratore veloce. In altre parole, genera un'eccezione ConcurrentModificationException quando la raccolta sottostante viene modificata durante l'iterazione. Vediamo l'esempio di fail-fast:

HashMap map = new HashMap(); map.put("key1", "value1"); map.put("key2", "value2"); Iterator iterator = map.keySet().iterator(); while(iterator.hasNext()){ iterator.next(); map.put("key4", "value4"); }

Questo genera un'eccezione ConcurrentModificationException perché stiamo chiamando put () durante l'iterazione della raccolta.

4. Quando scegliere HashMap su Hashtable

Dovremmo usare HashMap per un'applicazione non sincronizzata o a thread singolo.

Vale la pena ricordare che a partire da JDK 1.8, Hashtable è stato deprecato. Tuttavia, ConcurrentHashMap è un ottimo sostituto di Hashtable . Dovremmo considerare ConcurrentHashMap da utilizzare in applicazioni con più thread.

5. conclusione

In questo articolo, abbiamo illustrato le differenze tra HashMap e Hashtable e cosa tenere a mente quando dobbiamo sceglierne uno.

Come al solito, l'implementazione di tutti questi esempi e frammenti di codice è finita su Github.