Quelles sont les différences entre un `` et un `` en Java ?
Qui est plus efficace pour les applications non-thread ?
Il y a plusieurs différences entre les HashMap et table de hachage en Java:
HashMap
mieux pour les non-filetée applications, comme non synchronisées Objets réussissent généralement mieux que synchronisé.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.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.
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)
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 à
.
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.
Note sur le sens de Certains Termes
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.
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 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.