Différences entre HashMap et Hashtable

1. Vue d'ensemble

Dans ce court didacticiel, nous allons nous concentrer sur les principales différences entre le Hashtable et le HashMap .

2. Hashtable et HashMap en Java

Hashtable et HashMap sont assez similaires - les deux sont des collections qui implémentent l' interface Map .

De plus, les méthodes put () , get () , remove () et containsKey () fournissent des performances à temps constant O (1). En interne, ces méthodes fonctionnent sur la base d'un concept général de hachage utilisant des buckets pour stocker des données.

Aucune des deux classes ne conserve l'ordre d'insertion des éléments. En d'autres termes, le premier élément ajouté peut ne pas être le premier élément lorsque nous parcourons les valeurs.

Mais ils ont aussi des différences qui les rendent meilleurs que les autres dans certaines situations. Regardons de plus près ces différences.

3. Différences entre Hashtable et HashMap

3.1. Synchronisation

Premièrement, Hashtable est thread-safe et peut être partagé entre plusieurs threads de l'application.

D'autre part, HashMap n'est pas synchronisé et n'est pas accessible par plusieurs threads sans code de synchronisation supplémentaire. Nous pouvons utiliser Collections.synchronizedMap () pour créer une version thread-safe d'un HashMap . Nous pouvons également simplement créer un code de verrouillage personnalisé ou rendre le code thread-safe en utilisant le mot-clé synchronized .

HashMap n'est pas synchronisé, il est donc plus rapide et utilise moins de mémoire que Hashtable . En règle générale, les objets non synchronisés sont plus rapides que les objets synchronisés dans une seule application threadée.

3.2. Valeurs nulles

Une autre différence est la gestion des null . HashMap permet d'ajouter une entrée avec null comme clé ainsi que de nombreuses entrées avec null comme valeur. En revanche, Hashtable ne permet pas nul du tout . Voyons un exemple de null et HashMap :

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

Cela se traduira par:

assertEquals(3, map.size());

Ensuite, voyons en quoi Hashtable est différent:

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

Cela entraîne une NullPointerException . L'ajout d'un objet avec null comme clé entraîne également une NullPointerException :

table.put(null, "value");

3.3. Itération sur les éléments

HashMap utilise Iterator pour parcourir les valeurs, alors que Hashtable a Enumerator pour la même chose. L' itérateur est un successeur d' Enumerator qui élimine ses quelques inconvénients. Par exemple, Iterator a une méthode remove () pour supprimer des éléments des collections sous-jacentes.

L' itérateur est un itérateur rapide. En d'autres termes, il lève une ConcurrentModificationException lorsque la collection sous-jacente est modifiée lors de l'itération. Voyons l'exemple de l'échec rapide:

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"); }

Cela lève une exception ConcurrentModificationException car nous appelons put () lors de l'itération sur la collection.

4. Quand choisir HashMap sur Hashtable

Nous devrions utiliser HashMap pour une application non synchronisée ou à un seul thread.

Il est à noter que depuis JDK 1.8, Hashtable est obsolète. Cependant, ConcurrentHashMap est un excellent remplacement de Hashtable . Nous devrions considérer ConcurrentHashMap à utiliser dans les applications avec plusieurs threads.

5. Conclusion

Dans cet article, nous avons illustré les différences entre HashMap et Hashtable et ce qu'il faut garder à l'esprit lorsque nous devons en choisir un.

Comme d'habitude, l'implémentation de tous ces exemples et extraits de code est terminée sur Github.