J'essaie de comprendre quand et pourquoi utiliser un dictionnaire ou un HashTable. J'ai fait un peu de recherche ici et j'ai trouvé des gens qui parlaient des avantages génériques du dictionnaire avec lesquels je suis totalement d'accord, ce qui mène à l'avantage de la boxe et du déballage pour un léger gain de performances.
Mais j'ai également lu que le dictionnaire ne retournera pas toujours les objets dans l'ordre où ils sont insérés, chose qu'il est trié. Où comme HashTable le fera. Si je comprends bien, cela conduit à la table de hachage étant beaucoup plus rapide dans certaines situations.
Ma question est vraiment, quelles pourraient être ces situations? Suis-je juste dans mes hypothèses ci-dessus? Quelles situations pourriez-vous utiliser pour choisir l'une au-dessus de l'autre (oui, la dernière est un peu ambiguë).
Réponses:
System.Collections.Generic.Dictionary<TKey, TValue>
et lesSystem.Collections.Hashtable
classes conservent toutes les deux une structure de données de table de hachage en interne. Aucun d'eux ne garantit le maintien de l'ordre des articles.Laissant de côté les problèmes de boxe / déballage, la plupart du temps, ils devraient avoir des performances très similaires.
La principale différence structurelle entre eux est qu'elle
Dictionary
repose sur le chaînage (en conservant une liste d'éléments pour chaque compartiment de table de hachage) pour résoudre les collisions alors qu'elleHashtable
utilise le ressassement pour la résolution des collisions (lorsqu'une collision se produit, essaie une autre fonction de hachage pour mapper la clé sur un compartiment) .Il y a peu d'avantages à utiliser la
Hashtable
classe si vous ciblez .NET Framework 2.0+. Il est effectivement rendu obsolète parDictionary<TKey, TValue>
.la source
Hashtable
. Les tables de hachage stockent 3 informations dans une entrée: hachage de clé, clé elle-même et valeur. Pour les éléments avec un hachage égal, il devra parcourir la liste pour trouver l'élément avec une clé égale et retourner sa valeur. C'est à peu près vraiHashtable
aussi. En tant que développeur utilisantDictionary
normalement, vous n'avez pas à vous en préoccuper.Je suppose que cela ne signifie plus rien pour vous maintenant. Mais juste pour référence pour les gens qui passent
Test de performance - SortedList vs SortedDictionary vs Dictionary vs Hashtable
Allocation de mémoire:
Temps utilisé pour l'insertion:
Temps de recherche d'un article:
la source
Différences entre Hashtable et Dictionary
Dictionnaire:
Table de hachage:
la source
Une autre différence importante est que le type Hashtable prend en charge simultanément plusieurs lecteurs sans verrou et un seul écrivain, contrairement à Dictionary.
la source
Lien: http://msdn.microsoft.com/en-us/library/4yh14awz(v=vs.90).aspx
la source
Les deux sont en fait la même classe (vous pouvez regarder le démontage). HashTable a été créé avant que .Net n'ait des génériques. Le dictionnaire est cependant une classe générique et vous offre de forts avantages de frappe. Je n'utiliserais jamais HashTable car Dictionary ne vous coûte rien à utiliser.
la source
Une autre différence importante
Hashtable
est la sécurité des threads.Hashtable
a intégré la sécurité des threads à plusieurs lecteurs / écrivains uniques (MR / SW), ce qui signifieHashtable
autorise UN écrivain avec plusieurs lecteurs sans verrouillage. Dans le cas oùDictionary
il n'y a pas de sécurité de thread, si vous avez besoin de sécurité de thread, vous devez implémenter votre propre synchronisation.Pour développer davantage:
la source
Les dictionnaires ont l'avantage d'être de type générique, ce qui le rend sûr et un peu plus rapide en raison du manque de besoin de boxe. Le tableau de comparaison suivant (construit à partir des réponses trouvées dans un poste de question SO similaire ) illustre certaines des autres raisons qui prennent en charge les dictionnaires sur les tables de hachage (ou vice versa).
la source
Si vous vous souciez de la lecture qui renverra toujours les objets dans l'ordre où ils sont insérés dans un dictionnaire, vous pouvez jeter un œil à
OrderedDictionary - les valeurs sont accessibles via un index entier (par ordre dans lequel les éléments ont été ajoutés) SortedDictionary - les éléments sont automatiquement triés
la source
Le dictionnaire est plus rapide que la table de hachage car le dictionnaire est un type générique fort. Hashtable est plus lent car il prend l'objet comme type de données, ce qui conduit à la boxe et au déballage.
la source