J’essaie de savoir quand et pourquoi utiliser un dictionnaire ou une table de hachage. J’ai fait un peu de recherche ici et j’ai trouvé des gens parlant des avantages génériques du dictionnaire avec lequel je suis totalement d’accord, ce qui conduit à l’avantage de la boxe et du déballage pour un léger gain de performance.
Mais j’ai aussi lu que le dictionnaire ne renverra pas toujours les objects dans l’ordre dans lequel ils sont insérés, chose qu’il est sortingé. Où en tant que HashTable sera. Si je comprends bien, cela signifie que la HashTable est beaucoup plus rapide dans certaines situations.
Ma question est vraiment, que pourraient être ces situations? Est-ce que je me trompe 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ë).
System.Collections.Generic.Dictionary
classes System.Collections.Generic.Dictionary
et System.Collections.Hashtable
conservent toutes deux une structure de données de table de hachage en interne. Aucun d’entre eux ne garantit la conservation de l’ordre des articles.
Laissant de côté les problèmes de boxing / unboxing, la plupart du temps, ils devraient avoir des performances très similaires.
La principale différence structurelle entre eux est que Dictionary
repose sur le chaînage (maintien d’une liste d’éléments pour chaque compartiment de table de hachage) pour résoudre les collisions, tandis que Hashtable
utilise le rehashing pour la résolution des collisions (lorsqu’une collision se produit, seau).
L’utilisation de la classe Hashtable
présente peu d’intérêt si vous ciblez .NET Framework 2.0+. Il est effectivement rendu obsolète par Dictionary
.
Je suppose que cela ne signifie rien pour vous maintenant. Mais juste pour la référence pour les personnes qui s’arrêtent par
Test de performance – SortedList vs. SortedDictionary vs. Dictionary vs. Hashtable
Une autre différence importante est que le type Hashtable prend en charge plusieurs lecteurs sans locking et un seul graveur en même temps, contrairement à Dictionary.
Dictionnaire:
Hashtable:
MSDN Article: “La classe
Dictionary
a les mêmes fonctionnalités que la classeHashtable
. UnDictionary
d’un type spécifique (autreObject
) a de meilleures performances qu’uneHashtable
pour les types de valeur car les éléments deHashtable
sont du typeObject
et, par conséquent, la boxe et le unboxing se produisent généralement si vous stockez ou récupérez un type de valeur “.
Lien: http://msdn.microsoft.com/en-us/library/4yh14awz(v=vs.90).aspx
Les deux sont effectivement la même classe (vous pouvez regarder le déassembly). HashTable a été créé avant que .Net ait des génériques. Dictionary, cependant, est une classe générique et vous offre des avantages de typage forts. Je n’utiliserais jamais HashTable puisque Dictionary ne vous coûte rien à utiliser.
Une autre différence importante est que Hashtable
est Hashtable
threads. Hashtable
intègre la sécurité des threads multi-lecteurs / graveurs (MR / SW), ce qui signifie que Hashtable
permet à un seul graveur et à plusieurs lecteurs de se verrouiller. Dans le cas du Dictionary
il n’y a pas de sécurité des threads, si vous avez besoin de sécurité des threads, vous devez implémenter votre propre synchronisation.
Elaborer plus avant:
Hashtable
, fournit une certaine sécurité des threads via la propriété Synchronized, qui retourne un wrapper thread-safe autour de la collection. Le wrapper fonctionne en verrouillant la collection entière sur chaque opération d’ajout ou de suppression. Par conséquent, chaque thread qui tente d’accéder à la collection doit attendre son tour pour prendre le verrou unique. Cela n’est pas évolutif et peut entraîner une dégradation significative des performances pour les grandes collections. De plus, le design n’est pas complètement protégé des conditions de course.Les classes de collection .NET Framework 2.0 telles que
List
,Dictionary
, etc. ne fournissent aucune synchronisation de threads; Le code utilisateur doit fournir toute la synchronisation lorsque des éléments sont ajoutés ou supprimés simultanément sur plusieurs threads Si vous avez besoin de la sécurité des types et de la sécurité des threads, utilisez des classes de collections simultanées dans .NET Framework. Plus de lecture ici.
Si vous vous intéressez à la lecture, cela renverra toujours les objects dans l’ordre dans lequel ils sont insérés dans un dictionnaire.
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 sortingés
Dictionary est plus rapide que la hashtable car le dictionnaire est un type fort générique. Hashtable est plus lent car il prend un object comme type de données, ce qui conduit à la boxe et à la désencapsulation.