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


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


1203
2017-11-19 09:24


origine


Réponses:


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

Si vous vouliez dire "pourquoi utilisons-nous le Dictionary<TKey, TValue> classe au lieu de la Hashtable classe? ", alors c'est une réponse facile: Dictionary<TKey, TValue> est un type générique, Hashtable n'est pas. Cela signifie que vous obtenez la sécurité de type avec Dictionary<TKey, TValue>, parce que vous ne pouvez y insérer aucun objet aléatoire et que vous n'avez pas besoin de convertir les valeurs que vous en retirez.

Fait intéressant, le Dictionary<TKey, TValue> implémentation dans .NET Framework est basée sur 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 source de Hashtable

La source 


1405
2017-11-19 09:28



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

  • Générique  <<< >>> Non générique
  • Besoins propre synchronisation de thread <<< >>> Offres thread sûr version par Synchronized() méthode
  • Élément énuméré: KeyValuePair <<< >>> Article énuméré: DictionaryEntry
  • Plus récent (> .NET 2.0) <<< >>> Plus ancien (depuis .NET 1.0)
  • est dans System.Collections.Generic <<< >>> est en System.Collections 
  • Demande de clé non existante jette une exception <<< >>> Demande de clé non existante retourne null
  • potentiellement un peu plus rapide pour les types de valeur <<< >>> peu plus lent (nécessite boxing / unboxing) pour les types de valeur

Dictionary / Hashtable similitudes:

  • Les deux sont en interne hashtables == accès rapide à de nombreuses données selon la clé
  • Les deux ont besoin clés immuables et uniques
  • Les clés des deux ont besoin GetHashCode() méthode

Similaire Collections .NET (candidats à utiliser à la place de Dictionary et Hashtable):

  • ConcurrentDictionary - thread sûr (peut être accédé en toute sécurité à partir de plusieurs threads simultanément)
  • HybridDictionary - performance optimisée (pour quelques articles et aussi pour de nombreux articles)
  • OrderedDictionary - Les valeurs peuvent être accédé via int index (par ordre dans lequel les éléments ont été ajoutés)
  • SortedDictionary - articles automatiquement trié
  • StringDictionary - fortement typé et optimisé pour les chaînes

564
2018-04-21 10:32



Car Dictionary est une classe générique ( Dictionary<TKey, TValue> ), de sorte que l'accès à son contenu est sûr pour le type (c'est-à-dire que vous n'avez pas besoin 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 mis en œuvre comme Hashtable à l'intérieur, donc techniquement cela fonctionne de la même manière.


163
2017-11-19 09:27



FYI: En .NET, Hashtable est thread-safe pour une utilisation par plusieurs threads de lecture et un thread d'écriture unique, tandis que dans Dictionary Les membres statiques publics sont thread-safe, mais les membres d'instance ne sont pas garantis être thread-safe.

Nous avons dû changer tous nos Dictionnaires Hashtable à cause de ce.


80
2017-11-19 11:55



En .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 y a une coût de la mémoire à la boxe, cependant).


62
2017-11-19 09:28



Les gens disent qu'un dictionnaire est la même chose qu'une table de hachage.

Ce n'est pas forcément vrai. Une table de hachage est un la mise en oeuvre d'un dictionnaire. C'est un exemple typique, et il peut s'agir de celui par défaut de .NET, mais ce n'est pas par définition le seul.

Vous pourriez tout aussi bien implémenter un dictionnaire avec une liste chaînée ou un arbre de recherche, ce ne serait tout simplement pas aussi efficace (pour une métrique d'efficacité).


27
2017-11-19 13:03



Collections & Generics sont utiles pour gérer un groupe d'objets. Dans .NET, tous les objets de collections sont sous l'interface IEnumerable, qui à son tour a ArrayList(Index-Value)) & HashTable(Key-Value). Après .NET Framework 2.0, ArrayList & HashTable ont été remplacés par List & Dictionary. Maintenant le Arraylist & HashTable ne sont plus utilisés dans les projets d'aujourd'hui.

Venir à la différence entre HashTable & Dictionary, Dictionary est générique où comme Hastable n'est pas générique. Nous pouvons ajouter n'importe quel type d'objet à HashTable, mais en récupérant, nous devons le convertir au type requis. Donc, ce n'est pas sûr de type. 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 lors de la récupération.

Regardons un exemple:

HashTable

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
2017-09-17 11:10



Dictionnaire:

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

  • C'est plus rapide qu'une Hashtable car il n'y a pas de boxe et de déballage.

  • Seuls les membres statiques publics sont thread safe.

  • Le dictionnaire est un type générique, ce qui signifie que nous pouvons l'utiliser avec n'importe quel type de données (Lors de la création, vous devez 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 une implémentation de type Hashtable de type sécurité, Keys et Values sont fortement typés.

Hashtable:

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

  • Il est plus lent que le dictionnaire car il nécessite une boxe et unboxing.

  • Tous les membres d'un Hashtable sont thread safe,

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

  • Hashtable est une structure de données faiblement typée, nous pouvons ajouter des clés et des valeurs de n'importe quel type.


14
2018-05-28 07:53