Question Différences entre HashMap et Hashtable?


Quelles sont les différences entre un HashMap et un Hashtable en Java?

Quel est le plus efficace pour les applications non-threaded?


3113
2017-09-02 20:12


origine


Réponses:


Il y a plusieurs différences entre HashMap et Hashtable en Java:

  1. Hashtable est synchronisé, tandis que HashMap n'est pas. Cela fait HashMap mieux pour les applications non-threadées, car les objets non synchronisés fonctionnent généralement mieux que ceux synchronisés.

  2. Hashtable ne permet pas de null clés ou valeurs. HashMap permet un null clé et tout nombre de null valeurs.

  3. Une des sous-classes de HashMap est LinkedHashMapDonc, si vous voulez un ordre d'itération prévisible (qui est l'ordre d'insertion par défaut), vous pouvez facilement échanger HashMap pour un LinkedHashMap. Ce ne serait pas aussi facile si vous utilisiez Hashtable.

Puisque la synchronisation n'est pas un problème pour vous, je recommanderais HashMap. Si la synchronisation devient un problème, vous pouvez également regarder ConcurrentHashMap.


3203
2017-09-02 23:02



Notez que beaucoup de réponses indiquent que Hashtable est synchronisé. En pratique, cela vous achète très peu.  La synchronisation sur les méthodes accesseur / mutator arrêtera deux threads en ajoutant ou en supprimant simultanément de la map, mais dans le monde réel, vous aurez souvent besoin d'une synchronisation supplémentaire.

Un idiome très commun est de "vérifier puis mettre" - c'est-à-dire chercher une entrée dans la carte, et l'ajouter si elle n'existe pas déjà. Ce n'est en aucun cas une opération atomique que vous utilisiez Hashtable ou HashMap.

Un HashMap synchronisé de manière équivalente peut être obtenu par:

Collections.synchronizedMap(myMap);

Mais pour mettre en œuvre correctement cette logique, vous avez besoin synchronisation supplémentaire de la forme:

synchronized(myMap) {
    if (!myMap.containsKey("tomato"))
        myMap.put("tomato", "red");
}

Même itérer sur les entrées d'un Hashtable (ou un HashMap obtenu par Collections.synchronizedMap) n'est pas thread-safe sauf si vous empêchez également la carte d'être modifiée par une synchronisation supplémentaire.

Implémentations de ConcurrentMap interface (par exemple ConcurrentHashMap) résoudre une partie de ceci en incluant sécurité sémantique check-then-act sémantique tel que:

ConcurrentMap.putIfAbsent(key, value);

580
2017-09-03 11:00



Personne n'a mentionné le fait que Hashtable est ne pas une partie de la Java Collections Framework - il fournit juste une API similaire. Aussi, Hashtable est considéré comme un code existant. Il n'y a rien à propos de Hashtable cela ne peut pas être fait en utilisant HashMap ou des dérivations de HashMap, donc pour le nouveau code, je ne vois aucune justification pour revenir à Hashtable.


287
2018-06-25 01:46



Cette question est souvent posée en entrevue pour vérifier si le candidat comprend l'utilisation correcte des classes de collecte et est conscient des solutions alternatives disponibles.

  1. La classe HashMap est à peu près équivalente à Hashtable, sauf qu'elle est non synchronisée et autorise les valeurs nulles. (HashMap autorise les valeurs nulles comme clé et valeur alors que Hashtable n'autorise pas les valeurs nulles).
  2. HashMap ne garantit pas que l'ordre de la carte restera constant dans le temps.
  3. HashMap n'est pas synchronisé alors que Hashtable est synchronisé.
  4. Iterator dans HashMap est fail-safe alors que l'énumérateur de Hashtable ne l'est pas et lance ConcurrentModificationException si tout autre Thread modifie la structure de manière structurelle en ajoutant ou supprimant tout élément sauf la méthode remove () de Iterator. Mais ceci n'est pas un comportement garanti et sera fait par JVM au meilleur effort.

Note sur quelques termes importants

  1. Synchronisé signifie qu'un seul thread peut modifier une table de hachage à un moment donné. Fondamentalement, cela signifie que tout thread avant d'effectuer une mise à jour sur une hashtable devra acquérir un verrou sur l'objet tandis que d'autres attendront que le verrou soit libéré.
  2. Fail-safe est pertinent dans le contexte des itérateurs. Si un itérateur a été créé sur un objet de collection et qu'un autre thread essaie de modifier l'objet de collection "structurellement", une exception de modification simultanée sera levée. Il est possible que d'autres threads invoquent la méthode "set" car elle ne modifie pas la collection "structurellement". Cependant, si avant d'appeler "set", la collection a été modifiée structurellement, "IllegalArgumentException" sera levé.
  3. La modification structurelle signifie la suppression ou l'insertion d'un élément qui pourrait effectivement modifier la structure de la carte.

HashMap peut être synchronisé par

Map m = Collections.synchronizeMap(hashMap);

La carte fournit des vues de collection au lieu d'un support direct pour l'itération  via des objets d'énumération. Les vues de collection améliorent considérablement  l'expressivité de l'interface, comme indiqué plus loin dans cette section.  Map vous permet d'itérer sur des clés, des valeurs ou des paires clé-valeur;  Hashtable ne fournit pas la troisième option. La carte fournit un moyen sûr  supprimer des entrées au milieu de l'itération; Hashtable n'a pas fait.  Enfin, Map corrige une lacune mineure dans l'interface Hashtable.  Hashtable a une méthode appelée contient, qui renvoie vrai si le  Hashtable contient une valeur donnée. Compte tenu de son nom, vous vous attendez à ce que  méthode pour renvoyer true si le Hashtable contenait une clé donnée, car  la clé est le mécanisme d'accès principal pour une table de hachage. La carte  l'interface élimine cette source de confusion en renommant la méthode  containsValue. En outre, cela améliore la cohérence de l'interface -  containsValue parallèles containsKey.

L'interface de la carte


148
2017-10-04 06:39



HashMap: Une implémentation du Map interface qui utilise des codes de hachage pour indexer un tableau. Hashtable: Bonjour, 1998 appelé. Ils veulent récupérer leurs API de collections.

Sérieusement, vous feriez mieux de rester loin de Hashtable tout à fait. Pour les applications monothread, vous n'avez pas besoin de la surcharge supplémentaire de synchronisation. Pour les applications hautement concurrentes, la synchronisation paranoïaque peut entraîner la famine, des interblocages ou des pauses de récupération de place inutiles. Comme Tim Howland a souligné, vous pouvez utiliser ConcurrentHashMap au lieu.


107
2017-09-02 23:14



Garde en tête que HashTable était la classe d'héritage avant Java Collections Framework (JCF) a été introduit et a été plus tard mis à jour pour mettre en œuvre le Map interface. Donc était Vector et Stack.

Par conséquent, toujours rester loin d'eux dans un nouveau code car il y a toujours une meilleure alternative dans la JCFcomme d'autres l'ont souligné.

Voici la Feuille de triche de la collection Java que vous trouverez utile. Notez que le bloc gris contient la classe héritée HashTable, Vector et Stack.

enter image description here


104
2018-03-25 08:58



En plus de ce que dit izb, HashMap permet des valeurs nulles, alors que le Hashtable ne fait pas.

Notez également que Hashtable étend la Dictionary classe, qui en tant que Javadocs état, est obsolète et a été remplacé par le Map interface.


58
2017-09-02 20:30



Jetez un oeil à ce tableau. Il fournit des comparaisons entre différentes structures de données avec HashMap et Hashtable. La comparaison est précise, claire et facile à comprendre.

Matrice de collection Java


50
2017-11-20 05:35



Hashtable est similaire à HashMap et a une interface similaire. Il est recommandé d'utiliser HashMap, sauf si vous avez besoin d'un support pour les applications héritées ou si vous avez besoin d'une synchronisation, Hashtables les méthodes sont synchronisées. Donc dans votre cas, vous n'êtes pas multi-threading, HashMaps sont votre meilleur pari.


39
2017-09-02 20:25