Quelles sont les différences entre a HashMap
et a Hashtable
en Java?
Quel est le plus efficace pour les applications non filetées?
java
collections
hashmap
hashtable
dmanxiii
la source
la source
ConcurrentMap
n'est pas nécessaire ici, car la question dit «applications non threadées», ce qui signifie que le threading / concurrence n'est pas un problème.Réponses:
Il existe plusieurs différences entre
HashMap
etHashtable
en Java:Hashtable
est synchronisé , alors qu'ilHashMap
ne l'est pas. CelaHashMap
améliore les applications non threadées, car les objets non synchronisés fonctionnent généralement mieux que les objets synchronisés.Hashtable
n'autorise pas lesnull
clés ou les valeurs.HashMap
autorise unenull
clé et un nombre quelconque denull
valeurs.L'une des sous-classes de HashMap est
LinkedHashMap
, donc dans le cas où vous souhaitez un ordre d'itération prévisible (qui est l'ordre d'insertion par défaut), vous pouvez facilement échanger leHashMap
pour unLinkedHashMap
. Ce ne serait pas aussi facile si vous utilisiezHashtable
.Étant donné que la synchronisation n'est pas un problème pour vous, je recommanderais
HashMap
. Si la synchronisation devient un problème, vous pouvez également regarderConcurrentHashMap
.la source
Collections.synchronizedMap()
.Hashtable
( « synchronisation chaque méthode doit prendre soin de tout problème de concurrence! ») Fait très bien pire pour les applications threadées. Il vaut mieux synchroniser en externe unHashMap
(et réfléchir aux conséquences), ou utiliser uneConcurrentMap
implémentation (et exploiter son API étendue pour la concurrence). Conclusion: la seule raison d'utiliserHashtable
est lorsqu'une API héritée (à partir de 1996 environ) l'exige.Notez que la plupart des réponses indiquent que Hashtable est synchronisé. En pratique, cela vous achète très peu. La synchronisation est sur les méthodes accesseur / mutateur qui arrêteront l'ajout ou la suppression simultanée de deux threads de la carte, mais dans le monde réel, vous aurez souvent besoin d'une synchronisation supplémentaire.
Un idiome très courant consiste à "vérifier puis mettre" - c'est-à-dire rechercher une entrée dans le
Map
, et l'ajouter si elle n'existe pas déjà. Ce n'est en aucun cas une opération atomique que vous utilisiezHashtable
ouHashMap
.Une synchronisation équivalente
HashMap
peut être obtenue par:Mais pour implémenter correctement cette logique, vous avez besoin d' une synchronisation supplémentaire du formulaire:
Même itérer sur
Hashtable
les entrées de a (ou cellesHashMap
obtenues parCollections.synchronizedMap
) n'est pas sûr pour les threads, sauf si vous protégez également laMap
modification par une synchronisation supplémentaire.Les implémentations de l'
ConcurrentMap
interface (par exempleConcurrentHashMap
) résolvent certains de ces problèmes en incluant une sémantique de vérification puis d'action sécurisée pour les threads telle que:la source
Hashtable
est considéré comme un code hérité. Il n'y a rien àHashtable
ce sujet qui ne peut pas être fait en utilisantHashMap
ou en dérivantHashMap
, donc pour le nouveau code, je ne vois aucune justification pour y revenirHashtable
.la source
Cette question est souvent posée en entrevue pour vérifier si le candidat comprend l'utilisation correcte des classes de collecte et est au courant des solutions alternatives disponibles.
HashMap
classe est à peu près équivalente àHashtable
, sauf qu'elle n'est pas synchronisée et autorise les valeurs NULL. (HashMap
autorise les valeurs nulles comme clé et valeur tandis queHashtable
ne permet pasnull
s).HashMap
ne garantit pas que l'ordre de la carte restera constant dans le temps.HashMap
n'est pas synchronisé alors qu'ilHashtable
est synchronisé.HashMap
est est à sécurité intégrée tandis que l'énumérateur pour l'Hashtable
est ne l' est pas et jetteConcurrentModificationException
si un autre thread modifie la carte structurellement en ajoutant ou en supprimant tout élément à l'exception deIterator
la propreremove()
méthode de. Mais ce n'est pas un comportement garanti et cela sera fait par JVM au mieux.Remarque sur certains termes importants:
Hashtable
devra acquérir un verrou sur l'objet tandis que d'autres attendront que le verrou soit libéré.set
méthode car elle ne modifie pas la collection "structurellement". Cependant, si avant l'appelset
, la collection a été modifiée structurellement,IllegalArgumentException
elle sera levée.HashMap
peut être synchronisé parMap m = Collections.synchronizeMap(hashMap);
La carte fournit des vues de collection au lieu d'une prise en charge directe de l'itération via des objets d'énumération. Les vues de collection améliorent considérablement l'expressivité de l'interface, comme expliqué plus loin dans cette section. La carte 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 de supprimer des entrées au milieu de l'itération;Hashtable
non. Enfin, Map corrige une lacune mineure dans l'Hashtable
interface.Hashtable
a une méthode appelée contains, qui retourne true si leHashtable
contient une valeur donnée. Étant donné son nom, vous vous attendriez à ce que cette méthode retourne true si elleHashtable
contenait une clé donnée, car la clé est le mécanisme d'accès principal pour aHashtable
. L'interface Map élimine cette source de confusion en renommant la méthodecontainsValue
. En outre, cela améliore la cohérence de l'interface -containsValue
parallèlescontainsKey
.la source
set
opération sur aHashMap
. 3) L'put(...)
opération ne sera pas lancéeIllegalArgumentException
s'il y avait eu un changement précédent. 4) Le comportement de défaillance rapideHashMap
se produit également si vous modifiez un mappage. 5) Le comportement fail-fast est garanti. (Ce qui n'est pas garanti, c'est le comportement d'unHashTable
si vous effectuez une modification simultanée. Le comportement réel est ... imprévisible.)Hashtable
ne garantit pas non plus que l'ordre des éléments de la carte sera stable dans le temps. (Vous confondez peut-êtreHashtable
avecLinkedHashMap
.)thing.set(thing.get() + 1);
qui, le plus souvent, surprend les débutants par surprise comme complètement non protégé, surtout si les méthodesget()
etset()
sont synchronisées. Beaucoup d'entre eux attendent de la magie.HashMap
: Une implémentation de l'Map
interface qui utilise des codes de hachage pour indexer un tableau.Hashtable
: Salut, 1998 appelé. Ils veulent récupérer leur 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 simultanées, la synchronisation paranoïaque peut entraîner la famine, des blocages ou des pauses inutiles de récupération de place. Comme l'a souligné Tim Howland, vous pouvez utiliser à laConcurrentHashMap
place.la source
Gardez à l'esprit que
HashTable
c'était une classe héritée avant l'introduction de Java Collections Framework (JCF) et qu'elle a été ultérieurement mise à niveau pour implémenter l'Map
interface. Il en était de mêmeVector
pourStack
.Par conséquent, restez toujours à l'écart d'eux dans le nouveau code car il y a toujours une meilleure alternative dans le JCF comme 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.
la source
Il y a beaucoup de bonnes réponses déjà publiées. J'ajoute quelques nouveaux points et je le résume.
HashMap
et lesHashtable
deux sont utilisés pour stocker des données sous forme de clé et de valeur . Les deux utilisent la technique de hachage pour stocker des clés uniques. Mais il existe de nombreuses différences entre les classes HashMap et Hashtable indiquées ci-dessous.HashMap
HashMap
n'est pas synchronisé. Il n'est pas sûr pour les threads et ne peut pas être partagé entre plusieurs threads sans le bon code de synchronisation.HashMap
autorise une clé nulle et plusieurs valeurs nulles.HashMap
est une nouvelle classe introduite dans JDK 1.2.HashMap
est rapide.HashMap
comme synchronisé en appelant ce codeMap m = Collections.synchronizedMap(HashMap);
HashMap
est traversé par Iterator.HashMap
est rapide.HashMap
hérite de la classe AbstractMap.Hashtable
Hashtable
est synchronisé. Il est thread-safe et peut être partagé avec de nombreux threads.Hashtable
ne permet aucune clé ou valeur nulle.Hashtable
est une classe héritée.Hashtable
est lent.Hashtable
est synchronisé en interne et ne peut pas être désynchronisé.Hashtable
est traversé par Enumerator et Iterator.Hashtable
n'est pas infaillible.Hashtable
hérite de la classe Dictionary.Pour en savoir plus Quelle est la différence entre HashMap et Hashtable en Java?
la source
En plus de ce que dit izb,
HashMap
autorise les valeurs nulles, alors que leHashtable
ne le fait pas.Notez également que
Hashtable
étend laDictionary
classe, qui, comme l' état Javadocs , est obsolète et a été remplacée par l'Map
interface.la source
Jetez un œil à ce tableau. Il fournit des comparaisons entre différentes structures de données avec
HashMap
etHashtable
. La comparaison est précise, claire et facile à comprendre.Matrice de collection Java
la source
Hashtable
est similaire àHashMap
et possède une interface similaire. Il est recommandé de l'utiliserHashMap
, sauf si vous avez besoin de la prise en charge des applications héritées ou si vous avez besoin d'une synchronisation, car lesHashtables
méthodes sont synchronisées. Donc, dans votre cas, comme vous n'êtes pas multi-threading,HashMaps
vous êtes le meilleur choix.la source
Une autre différence clé entre la table de hachage et la table de hachage est que l'itérateur dans la table de hachage est rapide, tandis que l'énumérateur de la table de hachage ne l'est pas et lève ConcurrentModificationException si un autre thread modifie structurellement la carte en ajoutant ou en supprimant tout élément à l'exception de la méthode remove () d'itérateur. Mais ce n'est pas un comportement garanti et cela sera fait par JVM au mieux. "
Ma source: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html
la source
Outre tous les autres aspects importants déjà mentionnés ici, l'API Collections (par exemple, l'interface Map) est constamment modifiée pour se conformer aux "dernières et meilleures" ajouts aux spécifications Java.
Par exemple, comparez l'itération de la carte Java 5:
par rapport à l'ancienne approche Hashtable:
Dans Java 1.8, on nous promet également de pouvoir construire et accéder à des HashMaps comme dans les bons vieux langages de script:
Mise à jour: Non, ils n'atterriront pas en 1.8 ... :(
Les améliorations de la collection de Project Coin seront-elles dans JDK8?
la source
Hashtable
est synchronisé, alors qu'ilHashMap
ne l'est pas. Cela rendHashtable
plus lent queHashmap
.Pour les applications non filetées, utilisez-les
HashMap
car elles sont par ailleurs les mêmes en termes de fonctionnalités.la source
HashTable est synchronisé, si vous l'utilisez dans un seul thread, vous pouvez utiliser HashMap , qui est une version non synchronisée. Les objets non synchronisés sont souvent un peu plus performants. Soit dit en passant, si plusieurs threads accèdent simultanément à un HashMap et qu'au moins l'un des threads modifie la carte structurellement, il doit être synchronisé en externe. Vous pouvez envelopper une carte non synchronisée dans une carte synchronisée en utilisant:
HashTable ne peut contenir que des objets non nuls sous forme de clé ou de valeur. HashMap peut contenir une clé null et des valeurs null.
Les itérateurs retournés par Map sont résistants aux défaillances, si la map est structurellement modifiée à tout moment après la création de l'itérateur, de quelque manière que ce soit, sauf par la méthode de suppression de l'itérateur, l'itérateur lance un
ConcurrentModificationException
. Ainsi, face à une modification simultanée, l'itérateur échoue rapidement et proprement, plutôt que de risquer un comportement arbitraire et non déterministe à un moment indéterminé dans le futur. Tandis que les énumérations renvoyées par les méthodes de clés et d'éléments de Hashtable ne sont pas rapides.HashTable et HashMap sont membres du Java Collections Framework (depuis la plate-forme Java 2 v1.2, HashTable a été modernisé pour implémenter l'interface Map).
HashTable est considéré comme du code hérité, la documentation conseille d'utiliser ConcurrentHashMap à la place de Hashtable si une implémentation hautement concurrente thread-safe est souhaitée.
HashMap ne garantit pas l'ordre dans lequel les éléments sont retournés. Pour HashTable, je suppose que c'est la même chose mais je ne suis pas tout à fait sûr, je ne trouve pas de ressource qui l'indique clairement.
la source
HashMap
etHashtable
présentent également des différences algorithmiques importantes. Personne ne l'a mentionné auparavant, c'est pourquoi je le soulève.HashMap
va construire une table de hachage avec une puissance de deux tailles, l'augmenter dynamiquement de sorte que vous ayez au plus environ huit éléments (collisions) dans n'importe quel compartiment et agitera très bien les éléments pour les types d'éléments généraux. Cependant, l'Hashtable
implémentation fournit un contrôle meilleur et plus fin du hachage si vous savez ce que vous faites, à savoir que vous pouvez fixer la taille de la table en utilisant, par exemple, le nombre premier le plus proche de la taille de votre domaine de valeurs et cela se traduira par de meilleures performances que HashMap, c'est-à-dire moins de collisions pour certains cas.Indépendamment des différences évidentes discutées en détail dans cette question, je vois la Hashtable comme une voiture à "conduite manuelle" où vous avez un meilleur contrôle sur le hachage et la HashMap comme la contrepartie à "conduite automatique" qui fonctionnera généralement bien.
la source
Sur la base des informations ici , je recommanderais d'utiliser HashMap. Je pense que le plus grand avantage est que Java vous empêchera de le modifier pendant que vous itérez dessus, à moins que vous ne le fassiez via l'itérateur.
la source
Un
Collection
- parfois appelé conteneur - est simplement un objet qui regroupe plusieurs éléments en une seule unité.Collection
s sont utilisés pour stocker, récupérer, manipuler et communiquer des données agrégées. Un cadre de collections W est une architecture unifiée pour représenter et manipuler des collections.Le
HashMap
JDK1.2
et HashtableJDK1.0
, les deux sont utilisés pour représenter un groupe d'objets qui sont représentés par<Key, Value>
paire. Chaque<Key, Value>
paire est appeléeEntry
objet. La collection d'entrées est référencée par l'objet deHashMap
etHashtable
. Les clés d'une collection doivent être uniques ou distinctives. [car ils sont utilisés pour récupérer une valeur mappée une clé particulière. les valeurs d'une collection peuvent être dupliquées.]« Membre de Superclass, Legacy and Collection Framework
Hashtable est une classe héritée introduite dans
JDK1.0
, qui est une sous-classe de la classe Dictionary. FromJDK1.2
Hashtable est repensé pour implémenter l' interface Map afin de devenir membre du framework de collecte. HashMap est membre de Java Collection Framework dès le début de son introduction dansJDK1.2
. HashMap est la sous-classe de la classe AbstractMap.« Capacité initiale et facteur de charge
La capacité est le nombre de compartiments dans la table de hachage, et la capacité initiale est simplement la capacité au moment où la table de hachage est créée. Notez que la table de hachage est ouverte: dans le cas d'un "
hash
collision
", un seul compartiment stocke plusieurs entrées, qui doivent être recherchées séquentiellement. Le facteur de charge est une mesure de la capacité maximale de la table de hachage à obtenir avant que sa capacité soit automatiquement augmentée.HashMap construit une table de hachage vide avec la capacité initiale par défaut (16) et le facteur de charge par défaut (0,75). Là où Hashtable construit une table de hachage vide avec une capacité initiale par défaut (11) et un rapport facteur de charge / remplissage (0,75).
« Modification structurelle en cas de collision de hachage
HashMap
,Hashtable
en cas de collisions de hachage, ils stockent les entrées de la carte dans des listes chaînées. À partir de Java8,HashMap
si le compartiment de hachage dépasse un certain seuil, ce compartiment va basculerlinked list of entries to a balanced tree
. qui améliorent les performances les plus défavorables de O (n) à O (log n). Lors de la conversion de la liste en arbre binaire, le code de hachage est utilisé comme variable de branchement. S'il y a deux codes de hachage différents dans le même compartiment, l'un est considéré comme plus grand et va à droite de l'arbre et l'autre à gauche. Mais lorsque les deux codes de hachage sont égaux,HashMap
suppose que les clés sont comparables et compare la clé pour déterminer la direction afin de maintenir un certain ordre. Il est recommandé de créer les clés deHashMap
comparables . Lors de l'ajout d'entrées si la taille du compartiment atteintTREEIFY_THRESHOLD = 8
convertir la liste des entrées liées en une arborescence équilibrée, en supprimant les entrées moins queTREEIFY_THRESHOLD
et au plusUNTREEIFY_THRESHOLD = 6
reconvertira l'arborescence équilibrée en liste des entrées liées. Java 8 SRC , stackpost«Itération collection-vue, Fail-Fast et Fail-Safe
Iterator
est un échec de nature. c'est-à-dire qu'elle lève ConcurrentModificationException si une collection est modifiée lors de l'itération autre que sa propre méthode remove (). Où queEnumeration
soit de sécurité intrinsèque. Il ne lève aucune exception si une collection est modifiée pendant l'itération.Selon Java API Docs, Iterator est toujours préféré à l'énumération.
REMARQUE: la fonctionnalité de l'interface d'énumération est dupliquée par l'interface Iterator. De plus, Iterator ajoute une opération de suppression facultative et a des noms de méthode plus courts. Les nouvelles implémentations devraient envisager d'utiliser Iterator de préférence à Enumeration.
En Java 5, l'interface ConcurrentMap a été introduite :
ConcurrentHashMap
- uneConcurrentMap
implémentation hautement concurrente et performante soutenue par une table de hachage. Cette implémentation ne se bloque jamais lors des récupérations et permet au client de sélectionner le niveau de concurrence pour les mises à jour. Il se veut un remplacement de remplacementHashtable
: en plus de l'implémentationConcurrentMap
, il prend en charge toutes les méthodes "héritées" propres àHashtable
.La
HashMapEntry
valeur de chaque s est volatile garantissant ainsi la cohérence du grain fin pour les modifications contestées et les lectures ultérieures; chaque lecture reflète la dernière mise à jour terminéeLes itérateurs et les énumérations sont à sécurité intégrée - reflétant l'état à un moment donné depuis la création de l'itérateur / énumération; cela permet des lectures et des modifications simultanées au prix d'une cohérence réduite. Ils ne lèvent pas ConcurrentModificationException. Cependant, les itérateurs sont conçus pour être utilisés par un seul thread à la fois.
Comme
Hashtable
mais contrairement àHashMap
, cette classe ne permet pas d'utiliser null comme clé ou valeur.« Clés nulles et valeurs nulles
HashMap
autorise au maximum une clé nulle et un nombre quelconque de valeurs nulles. Où asHashtable
n'autorise même pas une seule clé null et une valeur null, si la clé ou la valeur null est alors elle lève NullPointerException. Exemple« Synchronisé, Thread Safe
Hashtable
est synchronisé en interne. Par conséquent, il est très sûr de l'utiliserHashtable
dans des applications multithread. Où asHashMap
n'est pas synchronisé en interne. Par conséquent, il n'est pas sûr de l'utiliserHashMap
dans des applications multithreads sans synchronisation externe. Vous pouvez synchroniser en externe enHashMap
utilisant laCollections.synchronizedMap()
méthode.« Performance
Comme il
Hashtable
est synchronisé en interne, cela rendHashtable
légèrement plus lent que leHashMap
.@Voir
HashMap
Java 8la source
Pour les applications filetées, vous pouvez souvent vous en sortir avec ConcurrentHashMap - cela dépend de vos exigences de performances.
la source
1.
Hashmap
et à laHashTable
fois stocker la clé et la valeur.2.
Hashmap
peut stocker une clé sousnull
.Hashtable
ne peut pas stockernull
.3.
HashMap
n'est pas synchronisé maisHashtable
est synchronisé.4.
HashMap
peut être synchronisé avecCollection.SyncronizedMap(map)
la source
Outre les différences déjà mentionnées, il convient de noter que depuis Java 8,
HashMap
remplace dynamiquement les nœuds (liste liée) utilisés dans chaque compartiment par TreeNodes (arbre rouge-noir), de sorte que même en cas de collisions de hachage élevées, le pire des cas lorsque la recherche estO (log (n)) pour
HashMap
Vs O (n) inHashtable
.* L'amélioration mentionnée ci - dessus n'a pas été appliquée
Hashtable
encore, mais seulementHashMap
,LinkedHashMap
etConcurrentHashMap
.Pour info, actuellement,
TREEIFY_THRESHOLD = 8
: si un compartiment contient plus de 8 nœuds, la liste chaînée est transformée en une arborescence équilibrée.UNTREEIFY_THRESHOLD = 6
: lorsqu'un compartiment devient trop petit (en raison de la suppression ou du redimensionnement), l'arborescence est reconvertie en liste liée.la source
Il existe 5 différenciations de base avec HashTable et HashMaps.
la source
Ma petite contribution:
la source
HashMap: C'est une classe disponible dans le package java.util et elle est utilisée pour stocker l'élément au format clé et valeur.
Hashtable: C'est une classe héritée qui est reconnue dans le cadre de la collection.
la source
HashTable est une classe héritée du jdk qui ne devrait plus être utilisée. Remplacez les utilisations de celui-ci par ConcurrentHashMap . Si vous n'avez pas besoin de la sécurité des threads, utilisez HashMap qui n'est pas threadsafe mais plus rapide et utilise moins de mémoire.
la source
Hashtable
est synchronisé alors queHashMap
ne l'est pas.HashMap
est à sécurité intégrée tandis que l'énumérateur pour leHashtable
n'est pas. Si vous modifiez la carte pendant l'itération, vous le saurez.HashMap
autorise des valeurs nulles, tandisHashtable
que non.la source
HashMap et HashTable
1) Hashtable et Hashmap implémentent l'interface java.util.Map 2) Hashmap et Hashtable est la collection basée sur le hachage. et travailler sur le hachage. ce sont donc des similitudes entre HashMap et HashTable.
1) La première différence est que HashMap n'est pas sûr pour les threads tandis que HashTable est pour ThreadSafe
2) HashMap est plus performant car il n'est pas sûr pour les threads. tandis que les performances de Hashtable ne sont pas meilleures car elles sont sûres pour les threads. donc plusieurs threads ne peuvent pas accéder à Hashtable en même temps.
la source
Hashtable:
Hashtable est une structure de données qui conserve les valeurs de la paire clé-valeur. Il n'autorise pas null pour les clés et les valeurs. Vous obtiendrez un
NullPointerException
si vous ajoutez une valeur nulle. Il est synchronisé. Cela vient donc avec son coût. Un seul thread peut accéder à HashTable à un moment donné.Exemple :
HashMap:
HashMap est comme Hashtable mais il accepte également une paire de valeurs clés. Il autorise null pour les clés et les valeurs. Ses performances sont meilleures que
HashTable
, car elles le sontunsynchronized
.Exemple:
la source
HashMap
est émulé et donc utilisable enGWT client code
alors qu'ilHashtable
ne l'est pas.la source
Sujet ancien et classique, je veux juste ajouter ce blog utile qui explique ceci:
http://blog.manishchhabra.com/2012/08/the-5-main-differences-betwen-hashmap-and-hashtable/
Blog de Manish Chhabra
la source
HashMap et Hashtable sont tous deux utilisés pour stocker des données sous forme de clé et de valeur. Les deux utilisent la technique de hachage pour stocker des clés uniques. ut il existe de nombreuses différences entre les classes HashMap et Hashtable qui sont données ci-dessous.
la source