Différence entre HashMap et HashTable
Bien que HashTable et HashMap sont basée sur le hachage et les deux implémentent l’interface Map, la principale différence est la suivante: HashMap n’est pas un thread-safe, alors que HashTable est un thread-safe. Cela signifie que vous ne pouvez pas utiliser HashMap dans une application Java multithread sans synchronisation externe. Une autre différence est que HashMap autorise une clé NULL et des valeurs NULL, mais HashTable n’autorise pas la valeur NULL dans la paire clé/valeur. En plus, la sécurité des threads de HashTable est obtenue à l’aide de la synchronisation interne, ce qui la rend plus lente que HashMap.
Table de comparaison
HashMap | HashTable | |
---|---|---|
Synchronisation | HashMap n’est pas synchronisé. Il n’est pas un thread-safe et ne peut pas être partagé entre plusieurs threads sans code de synchronisation approprié. | HashTable est synchronisé, est un thread-safe et peut être partagé avec de nombreux threads. |
Valeur Null | HashMap autorise une clé NULL et plusieurs valeurs NULL. | HashTable n’autorise aucune clé ou valeur nulle. |
JDK/Héritage | HashMap est une nouvelle classe introduite dans JDK 1.2. | HashTable est une classe héritée. |
Rapidité | HashMap est rapide. | HashTable est lent. |
Rendre synchronisable | Nous pouvons rendre HashMap synchronisée en appelant ce codeMap map = Collections.synchronizedMap(hashmap); |
HashTable est synchronisé en interne et ne peut pas être désynchronisé. |
Définition de HashTable
HashTable est une structure de données qui maintient une paire de clé/valeur. Il n’autorise pas la valeur null pour clés/valeurs. Vous aurez une exception NullPointerException si vous ajoutez une valeur null. HashTable est synchronisé, donc un seul thread peut accéder à un moment donné.
Exemple :
import java.util.Map; import java.util.Hashtable; public class ExempleHashtable { public static void main(String args[ ]) { Map<Integer,String> tuto = new Hashtable<Integer,String>(); tuto.put(1, "Java"); tuto.put(2, "Android"); tuto.put(3, "Linux"); //Léve une exception de type NullPointerEcxeption lors de l'exécution //tuto.put(4, null); System.out.println(tuto.get(1)); System.out.println(tuto.get(2)); System.out.println(tuto.get(3)); } }
La sortie
Java Android Linux
Définition de HashMap
HashMap est comme Hashtable mais accepte également une paire de clé/valeur. Il autorise la valeur null pour clés/valeurs. Ses performances sont meilleures que celles de HashTable, car il n’est pas synchronisé.
Exemple :
import java.util.HashMap; import java.util.Map; public class ExempleHashMap { public static void main(String args[]) { Map<Integer,String> tuto = new HashMap<Integer,String>(); tuto.put(1, "Java"); tuto.put(2, "Android"); tuto.put(3, "Linux"); //HashMap autorise clé/valeur = null tuto.put(4, null); tuto.put(null,"Mac"); System.out.println(tuto.get(1)); System.out.println(tuto.get(2)); System.out.println(tuto.get(3)); } }
La sortie
Java Android Linux
Conclusion
Comme indiqué ci-dessus, la différence clé entre HashMap et Hashtable est la synchronisation. Si un thread-safe est nécessaire, alors Hashtable peut être utilisé car toutes ses méthodes sont synchronisées, mais il s’agit d’une classe à héritée. Pour un environnement multi-thread, nous pouvons utiliser ConcurrentHashMap (presque similaire à Hashtable) ou même de rendre le HashMap synchronisé explicitement.