Pourquoi le dictionnaire est-il préféré au Hashtable?

dans la plupart des langages de programmation, les dictionnaires sont préférés aux hashtables. Quelles sont les raisons derrière cela?

1226
demandé sur Peter Mortensen 2008-11-19 12:24:24
la source

18 ответов

pour ce que ça vaut, un dictionnaire est (conceptuellement) une table de hachage.

si vous voulez dire "pourquoi utilisons-nous la classe Dictionary<TKey, TValue> au lieu de la classe Hashtable ?"puis c'est une réponse facile: Dictionary<TKey, TValue> est un type générique, Hashtable ne l'est pas. Cela signifie que vous obtenez la sécurité de type avec Dictionary<TKey, TValue> , parce que vous ne pouvez pas insérer n'importe quel objet aléatoire dans elle, et vous ne devez pas jeter les valeurs que vous prenez.

Il est intéressant de noter que la mise en œuvre de Dictionary<TKey, TValue> dans le cadre de .NET est basée sur le Hashtable , comme vous pouvez le voir à partir de ce commentaire dans son code source:

Le Dictionnaire générique a été copié à partir de la table de hachage de la source

Source

1422
répondu Michael Madsen 2017-12-15 15:52:41
la source

Dictionary <<<>>> Hashtable différences:

  • Générique <<<>>> Non Générique
  • Besoins propre de synchronisation de thread <<<>>> Offre thread-safe version par l'intermédiaire de Synchronized() méthode
  • énuméré point: KeyValuePair <<<>>> article énuméré: DictionaryEntry
  • Plus Récent (> .NET 2.0 ) <<<>>> plus âgé (depuis .NET 1.0 )
  • est dans le système .Collection.Le générique est dans le système .Collections
  • demande à la clé non existante lance l'exception < < < < > > > Requête à la clé non existante renvoie null
  • potentiellement un peu plus rapide pour les types de valeur <<<>>> un peu plus lent (nécessite boxe/unboxing) pour les types de valeur

Dictionary / Hashtable similitudes:

  • les deux sont internes hashtables = = accès rapide aux données à plusieurs éléments selon la clé
  • les deux ont besoin clés immuables et uniques
  • clés des deux besoin propre GetHashCode() méthode

Similar .net collections (candidats à utiliser au lieu du dictionnaire et du Hashtable):

  • ConcurrentDictionary - fil de sécurité (accessible en toute sécurité à partir de plusieurs threads simultanément)
  • HybridDictionary - performance optimisée (pour peu d'articles et aussi pour de nombreux articles)
  • OrderedDictionary - les valeurs peuvent être accessible via l'index int (par ordre dans lequel les éléments ont été ajoutés)
  • SortedDictionary - objets triés automatiquement
  • StringDictionary - fortement dactylographié et optimisé pour les cordes
574
répondu Thetam 2013-01-15 13:59:08
la source

parce que Dictionary est une classe générique ( Dictionary<TKey, TValue> ), de sorte que l'accès à son contenu est sans danger de type (i.e. vous n'avez pas besoin de lancer à partir de Object , comme vous le faites avec un Hashtable ).

comparer

var customers = new Dictionary<string, Customer>();
...
Customer customer = customers["Ali G"];

à

var customers = new Hashtable();
...
Customer customer = customers["Ali G"] as Customer;

cependant, Dictionary est implémenté comme Hashtable à l'intérieur, donc techniquement cela fonctionne de la même manière.

164
répondu gius 2016-12-06 15:43:52
la source

FYI: dans .NET, Hashtable est thread safe pour une utilisation par plusieurs threads de lecteur et un seul thread d'écriture, tandis que dans Dictionary public static members sont thread safe, mais les membres d'instance ne sont pas garantis d'être thread safe.

nous avons dû changer tous nos dictionnaires en Hashtable à cause de cela.

81
répondu user38902 2017-10-23 11:00:20
la source

dans .NET, la différence entre Dictionary<,> et HashTable est principalement que le premier est un type générique, donc vous obtenez tous les avantages des génériques en termes de vérification de type statique (et la boxe réduite, mais ce n'est pas aussi grand que les gens ont tendance à penser en termes de performance - Il ya un coût mémoire défini à la boxe, cependant).

63
répondu Marc Gravell 2008-11-19 12:54:50
la source

les Gens disent qu'un Dictionnaire est la même qu'une table de hachage.

Ce n'est pas nécessairement vrai. Une table de hachage est un implémentation d'un dictionnaire. Un exemple typique, et il peut être celui par défaut .NET, mais ce n'est pas par définition le seul.

vous pourriez également bien mettre en œuvre un dictionnaire avec une liste liée ou un arbre de recherche, il serait tout simplement pas aussi efficace (pour une métrique de efficace).

28
répondu rix0rrr 2010-03-09 15:19:56
la source

Collections & Generics sont utiles pour manipuler le groupe d'objets. Dans .NET, tous les objets de collections relèvent de l'interface IEnumerable , qui à son tour a ArrayList(Index-Value)) & HashTable(Key-Value) . Après .NET framework 2.0, ArrayList et HashTable ont été remplacés par List et Dictionary . Aujourd'hui, les Arraylist et HashTable ne sont plus utilisés dans les projets actuels.

vient à la différence entre HashTable & Dictionary , Dictionary est générique où Hastable n'est pas Générique. Nous pouvons ajouter n'importe quel type d'objet à HashTable , mais tout en récupérant nous devons le mouler au type requis. Donc, il n'est pas sécurisé. Mais à dictionary , tout en se déclarant Nous pouvons spécifier le type de clé et de valeur, il n'y a donc pas besoin de lancer tout en récupérant.

regardons un exemple:

table de hachage

class HashTableProgram
{
    static void Main(string[] args)
    {
        Hashtable ht = new Hashtable();
        ht.Add(1, "One");
        ht.Add(2, "Two");
        ht.Add(3, "Three");
        foreach (DictionaryEntry de in ht)
        {
            int Key = (int)de.Key; //Casting
            string value = de.Value.ToString(); //Casting
            Console.WriteLine(Key + " " + value);
        }

    }
}

Dictionnaire

class DictionaryProgram
{
    static void Main(string[] args)
    {
        Dictionary<int, string> dt = new Dictionary<int, string>();
        dt.Add(1, "One");
        dt.Add(2, "Two");
        dt.Add(3, "Three");
        foreach (KeyValuePair<int, String> kv in dt)
        {
            Console.WriteLine(kv.Key + " " + kv.Value);
        }
    }
}
21
répondu Sujit 2017-10-23 11:14:45
la source

Dictionnaire:

  • Il retourne/lance une Exception si nous essayons de trouver une clé qui n'existe pas.

  • il est plus rapide qu'un Hashtable parce qu'il n'y a pas de boxe et unboxing.

  • seuls les membres publics statiques sont protégés.

  • dictionnaire est un type générique qui signifie que nous peut l'utiliser avec n'importe quel type de données (lors de la création, doit spécifier les types de données pour les clés et les valeurs).

    exemple: Dictionary<string, string> <NameOfDictionaryVar> = new Dictionary<string, string>();

  • Dictionay est un type sûr de la mise en œuvre de la table de hachage, Keys et Values sont fortement typés.

Hashtable:

  • , Elle renvoie null si nous essayons de trouver une clé qui n'existe pas.

  • il est plus lent que dictionary parce qu'il nécessite la boxe et le non-boxe.

  • tous les membres dans un Hashtable sont thread safe,

  • Hashtable n'est pas un type générique,

  • Hashtable est une structure de données peu structurée, nous pouvons ajouter des clés et des valeurs de tout type.

14
répondu Altaf Patel 2014-06-25 09:23:40
la source

depuis .net Framework 3.5 il y a aussi un HashSet<T> qui fournit tous les avantages de la Dictionary<TKey, TValue> si vous avez besoin seulement des clés et des valeurs no.

donc, si vous utilisez un Dictionary<MyType, object> et Toujours mettre la valeur à null pour simuler le type de table de hachage de sécurité, vous devriez peut-être envisager de passer à la HashSet<T> .

14
répondu Oliver 2017-10-23 11:15:58
la source

Le un Examen approfondi des Structures de Données à l'Aide de C# article sur MSDN indique qu'il y a aussi une différence dans la résolution de collision stratégie :

la classe Hashtable utilise une technique appelée .

reformuler fonctionne comme suit: il y a un ensemble de hachage différentes fonctions, H 1 ... H n , et lors de l'insertion ou de la récupération d'un article du hachage table, initialement la fonction de hachage h 1 est utilisée. Si cela conduit à une collision, h 2 est essayé à la place, et à partir de H n si nécessaire.

Le Dictionnaire utilise une technique appelée chaînage .

avec reprise, en cas de collision le hachage est recalculé, et la nouvelle fente correspondant à un hachage est essayée. Avec le chaînage, cependant, une structure de données secondaire est utilisée pour tenir toute collision . Spécifiquement, chaque fente dans le dictionnaire a un tableau d'éléments qui correspondent à ce seau. Dans le cas d'une collision, les l'élément de collision est ajouté à la liste du seau.

12
répondu alexandrekow 2014-11-18 14:35:50
la source

le Hashtable est une structure de données peu structurée, vous pouvez donc ajouter des clés et des valeurs de n'importe quel type au Hashtable . La classe Dictionary est une implémentation de type-safe Hashtable , et les clés et les valeurs sont fortement typées. Lors de la création d'une instance Dictionary , vous devez spécifier les types de données pour la clé et la valeur.

9
répondu flesh 2015-09-14 08:19:47
la source

Avis que MSDN dit: "Dictionnaire<(Of <(TKey, TValue>)>) classe est implémentée comme un table de hachage ", pas "Dictionnaire<(Of <(TKey, TValue>)>) classe est implémentée comme un table de hachage "

Dictionnaire n'est PAS mis en œuvre comme une table de hachage, mais il est mis en œuvre suivant le concept d'une table de hachage. La mise en œuvre n'est pas liée à la classe HashTable en raison de l'utilisation de génériques, bien que Microsoft interne pourrait ont utilisé le même code et remplacé les symboles de type Object par TKey et TValue.

dans .NET 1.0 Generics n'existait pas; c'est là que le HashTable et L'ArrayList ont commencé à l'origine.

8
répondu Brant 2017-10-23 11:10:15
la source

un objet Hachable se compose de seaux qui contiennent les éléments de la collection. Un seau est un sous-groupe virtuel d'éléments dans le Hashtable, qui rend la recherche et l'extraction plus facile et plus rapide que dans la plupart des collections .

la classe du dictionnaire a la même fonctionnalité que la classe du Hashtable. Un dictionnaire d'un type spécifique (autre qu'objet) a de meilleures performances qu'un Hashtable pour valeur types parce que les éléments de Hashtable sont de type Objet et, par conséquent, la boxe et le désembuage se produisent typiquement si stocker ou récupérer un type de valeur.

pour une lecture plus approfondie: types de Collection de hachettes et de dictionnaires

7
répondu mparkuk 2015-11-12 13:51:13
la source

HashTable:

La clé/valeur

sera convertie en un type d'objet (boxing) lors du stockage dans le tas.

La clé/valeur

doit être convertie dans le type désiré lors de la lecture du tas.

Ces opérations sont très coûteuses. Nous devons éviter autant que possible la boxe et le non-boxe.

Dictionnaire : Générique variante de la table de hachage.

Pas de boxing/unboxing. Pas de conversions nécessaires.

7
répondu Siva Sankar Gorantla 2017-10-23 11:19:25
la source

une autre différence que je peux comprendre est:

Nous ne pouvons pas utiliser le Dictionnaire (génériques) avec des services web. La raison en est qu'aucune norme de service web n'appuie la norme des produits génériques.

5
répondu Peter Mortensen 2017-10-23 11:05:50
la source

Dictionary<> est un type générique et donc c'est un type sûr.

vous pouvez insérer n'importe quel type de valeur dans le HashTable et cela peut parfois jeter une exception. Mais Dictionary<int> n'acceptera que les valeurs entières et de la même manière Dictionary<string> n'acceptera que les chaînes.

il est donc préférable d'utiliser Dictionary<> au lieu de HashTable .

5
répondu Kishore Kumar 2017-10-23 11:12:51
la source

une autre différence importante est que le Hashtable est sans fil. Hashtable a intégré plusieurs lecteur / auteur simple (MR/SW) sécurité de fil qui signifie Hashtable permet à un auteur avec plusieurs lecteurs sans verrouillage.

dans le cas du dictionnaire Il n'y a pas de sécurité de fil; si vous avez besoin de la sécurité de fil, vous devez mettre en œuvre votre propre synchronisation.

pour développer davantage:

Hashtable fournit une certaine sécurité de fil par le biais de la propriété Synchronized , qui renvoie une enveloppe de fil sécuritaire autour de la collection. L'emballage fonctionne en verrouillant toute la collection à 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 une serrure. Cela n'est pas évolutif et peut causer une dégradation importante de la performance pour les grandes collections. De plus, la conception n'est pas complètement protégée des conditions de course.

.NET Framework 2.0 classes de collection comme List<T>, Dictionary<TKey, TValue> , etc. ne pas fournir une synchronisation des threads; code d'utilisateur doit fournir tous les synchronisation lorsque des éléments sont ajoutés ou supprimés sur plusieurs threads simultanément

si vous avez besoin de la sécurité de type ainsi que de la sécurité de thread, utilisez les classes de collections concurrentes dans le Framework .NET. Pour en savoir plus ici .

supplémentaires différence est que lorsque nous ajouter les différentes entrées de Dictionnaire, l'ordre dans lequel les entrées sont ajoutées est maintenu. Lorsque nous récupérons les éléments du dictionnaire, nous obtiendrons les enregistrements dans le même ordre que nous les avons insérés. Alors que Hashtable ne préserve pas l'ordre d'insertion.

5
répondu NullReference 2017-10-23 11:18:33
la source

selon ce que je vois en utilisant . réflecteur net :

[Serializable, ComVisible(true)]
public abstract class DictionaryBase : IDictionary, ICollection, IEnumerable
{
    // Fields
    private Hashtable hashtable;

    // Methods
    protected DictionaryBase();
    public void Clear();
.
.
.
}
Take note of these lines
// Fields
private Hashtable hashtable;

donc nous pouvons être sûrs que DictionaryBase utilise un HashTable interne.

-1
répondu Peter Mortensen 2017-10-23 11:12:07
la source

Autres questions sur c# data-structures .net vb.net