Quelles sont les différences entre HashMap et Hashtable en Java, leurs points forts et points faibles ?

Les classes Hashtable et Hashmap sont au premier abord similaires puisqu'elles permettent de stocker des données sous la forme clé - valeur dans une variable.

Il existe dans le langage Java de nombreuses classes pour stocker ses données et les parcourir facilement. Les classes Hashtable et Hashmap sont au premier abord similaires puisqu'elles permettent de stocker des données sous la forme clé - valeur dans une variable.

Exemples :

Hashtable h = new Hashtable(); 
h.put(clé1, val1);
v = h.get(clé1); //La variable v reçoit la valeur val1.
HashMap<String,String> map = new HashMap<String,String>();
map.put(clé1, val1);
v = map.get(clé1); //La variable v reçoit la valeur val1.

Les deux classes s'utilisent exactement de la même manière mais possèdent des différences dans leur conception. La classe Hashtable est synchronisée, c'est-à-dire qu'elle est conçue pour être utilisée par des applications qui gèrent des processus multiples, ou multithread. Les classes synchronisées sont par contre moins performantes dans le cas classique d'une application à un processus, donc la classe Hashmap est plus rapide en général. La classe HashTable n'accepte pas la valeur Null, que ce soit pour les clés ou pour les valeurs alors que la classe HashMap autorise une seule clé avec la valeur Null et autant de valeurs égales à Null que possible.

Le dernier avantage de la classe Hashmap est la classe LinkedHashMap, une classe dérivée permettant de trier les données en fonction de leur clé. Il est plus facile de passer d'une HashMap à une LinkedhashMap qu'à partir d'un HashTable. Si votre application doit utiliser plusieurs processus, utilisez la classe HashTable, sinon la classe HashMap est préférable. Il est aussi possible de synchroniser une HashMap avec la ligne suivante :

Collections.synchronizedMap(myMap);