4184 votes

Différences entre HashMap et Hashtable ?

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

Qui est plus efficace pour les applications non-thread ?

4136voto

Josh Brown Points 16044

Il y a plusieurs différences entre les HashMap et table de hachage en Java:

  1. Table de hachage est synchronisé, alors que la table de hachage n'est pas. Cela rend HashMap mieux pour les non-filetée applications, comme non synchronisées Objets réussissent généralement mieux que synchronisé.
  2. Hashtable ne pas autoriser les valeurs null des clés ou des valeurs. HashMap permet une clé null et un certain nombre d' null valeurs.
  3. L'un des HashMap du sous-classes est LinkedHashMap, donc dans le cas où vous voudriez prévisible itération (ce qui est de l'ordre d'insertion par défaut), vous pouvez facilement échanger l' HashMap d'un LinkedHashMap. Ce ne serait pas aussi facile si vous utilisez l' Hashtable.

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

767voto

serg10 Points 10157

Noter qu'un grand nombre de réponses de l'état que la table de hachage est synchronisé. Dans la pratique, cela vous achète très peu. La synchronisation est sur l'accesseur / mutateur méthodes d'arrêter les deux fils de l'ajout ou de la suppression de la carte simultanément, mais dans le monde réel, vous aurez souvent besoin de plus de synchronisation.

Un très commune idiome est de "vérifier ensuite mettre" - à savoir, recherchez une entrée dans la Carte, et l'ajouter si elle n'existe pas déjà. Ce n'est en aucune façon une opération atomique si vous utilisez la table de hachage ou une table de hachage.

D'une manière équivalente synchronisée table de hachage peut être obtenue par:

Collections.synchronizedMap(myMap);

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

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

Même itération sur les entrées d'une table de hachage (ou une table de hachage obtenue par les Collections.synchronizedMap) n'est pas thread-safe, sauf si vous aussi vous garde la Carte d'être modifié par l'ajout de la synchronisation.

Les implémentations de la ConcurrentMap de l'interface (par exemple ConcurrentHashMap) résoudre certains de ce dont thread-safe check-puis-loi sur la sémantique tels que:

ConcurrentMap.putIfAbsent(key, value)

413voto

aberrant80 Points 4544

Personne n’a mentionné le fait que ne fait *pas* partie du Java Collections Framework - il juste fournit une API similaire. En outre, est considéré comme le code hérité. Il n’y a rien sur les qui ne peut se faire en utilisant ou des dérivations de , donc pour le nouveau code, je ne vois aucune justification pour revenir à .

219voto

sravan Points 2403

Cette question est souvent posée dans l'interview à vérifier si le candidat comprend l'utilisation correcte des classes de collection et est au courant des solutions de rechange disponibles.

  1. La classe HashMap est à peu près équivalent à la table de hachage, sauf qu'il est non synchronisés et autorise les valeurs null. (HashMap autorise les valeurs null comme une clé et une valeur alors que la table de hachage ne pas autoriser les valeurs null).
  2. HashMap ne garantit pas que l'ordre de la carte restera constante au cours du temps.
  3. HashMap est non synchronisé alors que la table de hachage est synchronisé.
  4. Itérateur dans la table de hachage est fail-safe tandis que l'agent recenseur pour la table de hachage n'est pas et de le jeter ConcurrentModificationException si un autre Thread modifie la carte structurellement par l'ajout ou la suppression de tout élément à l'exception Itérateur propre méthode remove (). Mais ce n'est pas une garantie de comportement et seront effectués par la JVM sur best effort.

Note sur le sens de Certains Termes

  1. Synchronisé signifie qu'un seul thread peut modifier une table de hachage à un moment donné du temps. Fondamentalement, cela signifie que n'importe quel thread avant d'effectuer une mise à jour sur une table de hachage ont pour acquérir un verrou sur l'objet, tandis que d'autres devront attendre verrou pour être libérés.
  2. Fail-safe est pertinent à partir du contexte d'itérateurs. Si un itérateur a été créé sur un objet de collection et un autre thread tente de modifier l'objet de collection "structurellement", en même temps une modification exception sera levée. Il est possible que d'autres threads bien que d'invoquer le "set" de la méthode, car il ne modifie pas la collection "structurellement". Toutefois, si avant d'appeler la fonction "set", la collection a été modifiée structurellement, "IllegalArgumentException" sera levée.
  3. Structurellement modification signifie la suppression ou l'insertion d'élément qui pourrait effectivement modifier la structure de la carte.

Table de hachage peut être synchronisée par

Map m = Collections.synchronizeMap(hashMap);

La carte offre des vues de la Collection au lieu de l'aide directe pour l'itération par l'Énumération des objets. Les vues de la Collection d'améliorer considérablement la l'expressivité de l'interface, comme indiqué plus loin dans cette section. La carte vous permet d'itérer sur les touches, des valeurs ou des paires clé-valeur; Table de hachage ne fournit pas de troisième option. La carte est un moyen sûr pour supprimer des entrées dans le milieu de l'itération; table de hachage n'a pas. Enfin, la Carte corrige un défaut mineur dans la table de hachage de l'interface. Table de hachage a une méthode appelée contient, qui renvoie true si l' Table de hachage contient une valeur donnée. Donné son nom, vous vous attendez à ce méthode retourne true si la table de hachage contenait une clé donnée, parce que la clé est le principal mécanisme d'accès pour une table de hachage. La Carte interface élimine cette source de confusion par le fait de renommer la méthode containsValue. Aussi, ce qui améliore l'interface de cohérence containsValue parallels containsKey.

L'Interface De La Carte

149voto

Apocalisp Points 22526

HashMap: Une mise en œuvre de l' Map interface qui utilise des codes de hachage à l'index d'un tableau. Hashtable: Salut, 1998 appelé. Ils veulent que leurs collections API de retour.

Sérieusement, vous êtes mieux de rester à l'écart de Hashtable tout à fait. Single-threaded apps, vous n'avez pas besoin d'une charge supplémentaire de syncrhonisation. Très simultanée des applications, le paranoïaque synchronisation pourrait conduire à la famine, des blocages, ou inutile de collecte des ordures pauses. Comme Tim Howland a souligné, vous pouvez utiliser ConcurrentHashMap à la place.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X