Frage Warum ist Wörterbuch über Hashtable bevorzugt?


In den meisten Programmiersprachen werden Wörterbücher den Hashtabellen vorgezogen. Was sind die Gründe dafür?


1203
2017-11-19 09:24


Ursprung


Antworten:


Für was es sich lohnt, ein Wörterbuch ist (konzeptionell) eine Hash-Tabelle.

Wenn du meintest: "Warum benutzen wir das? Dictionary<TKey, TValue> Klasse statt der Hashtable Klasse? ", dann ist es eine einfache Antwort: Dictionary<TKey, TValue> ist ein generischer Typ, Hashtable ist nicht. Das heißt, Sie bekommen Typsicherheit mit Dictionary<TKey, TValue>, weil Sie kein beliebiges Objekt einfügen können und die Werte, die Sie herausnehmen, nicht umwandeln müssen.

Interessanterweise Dictionary<TKey, TValue> Die Implementierung in .NET Framework basiert auf der Hashtable, wie Sie an diesem Kommentar im Quelltext erkennen können:

Das generische Dictionary wurde aus Hashtables Quelle kopiert

Quelle 


1405
2017-11-19 09:28



Dictionary <<< >>> Hashtable Unterschiede:

  • Generisch  <<< >>> Nicht-generisch
  • Bedürfnisse eigene Thread-Synchronisation <<< >>> Angebote fadensicher Version durch Synchronized() Methode
  • Aufzählung: KeyValuePair <<< >>> Aufzählung: DictionaryEntry
  • Neuere (> .NET 2.0) <<< >>> Älter (seit .NET 1.0)
  • ist in System.Collections.Generisch <<< >>> ist in System.Kollektionen 
  • Anfrage an nicht vorhandenen Schlüssel löst Ausnahme aus <<< >>> Anfrage an nicht vorhandenen Schlüssel gibt null zurück
  • möglicherweise ein bisschen schneller für Werttypen <<< >>> etwas langsamer (benötigt Boxing / Unboxing) für Werttypen

Dictionary / Hashtable Ähnlichkeiten:

  • Beide sind intern Hashtabellen == Schneller Zugriff auf viele Artikeldaten nach Schlüssel
  • Beide brauchen unveränderliche und einzigartige Schlüssel
  • Schlüssel von beiden brauchen eigene GetHashCode() Methode

Ähnlich .NET-Sammlungen (Kandidaten, die anstelle von Dictionary und Hashtable verwendet werden sollen):

  • ConcurrentDictionary - fadensicher (kann von mehreren Threads gleichzeitig sicher zugegriffen werden)
  • HybridDictionary - optimierte Leistung (für wenige Artikel und auch für viele Artikel)
  • OrderedDictionary - Werte können sein Zugriff über den Index int (nach Reihenfolge, in der Artikel hinzugefügt wurden)
  • SortedDictionary - Artikel automatisch sortiert
  • StringDictionary - stark typisiert und optimiert für Strings

564
2018-04-21 10:32



weil Dictionary ist eine generische Klasse ( Dictionary<TKey, TValue> ), so dass der Zugriff auf den Inhalt typsicher ist (d. h. Sie müssen nicht von Object, wie du es mit a machst Hashtable).

Vergleichen

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

zu

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

Jedoch, Dictionary ist als implementiert Hashtable innen, so technisch funktioniert es genauso.


163
2017-11-19 09:27



Zu Ihrer Information: In .NET, Hashtable ist threadsicher für die Verwendung durch mehrere Leser-Threads und einen einzelnen Schreib-Thread, während in Dictionary Öffentliche statische Mitglieder sind threadsicher, aber alle Instanzmitglieder sind nicht garantiert threadsicher.

Wir mussten alle unsere Wörterbücher zurück auf ändern Hashtable aus diesem Grund.


80
2017-11-19 11:55



In .NET unterscheidet sich der Unterschied zwischen Dictionary<,> und HashTable ist in erster Linie, dass der ehemalige ist ein generischer Typ, so dass Sie alle Vorteile von Generika in Bezug auf die statische Überprüfung Typ (und reduziert Boxen, aber das ist nicht so groß wie Menschen neigen dazu, in Bezug auf Leistung zu denken - es gibt eine bestimmte Speicherkosten zum Boxen, obwohl).


62
2017-11-19 09:28



Die Leute sagen, dass ein Dictionary dasselbe ist wie eine Hash-Tabelle.

Dies ist nicht unbedingt wahr. Eine Hash-Tabelle ist ein Implementierung eines Wörterbuchs. Ein typisches Beispiel dafür, und zwar in .NET, aber nicht per Definition.

Sie könnten genauso gut ein Wörterbuch mit einer verknüpften Liste oder einem Suchbaum implementieren, es wäre einfach nicht so effizient (für einige Metrik effizient).


27
2017-11-19 13:03



Collections & Generics sind nützlich für die Behandlung von Objektgruppen. In .NET kommen alle Auflistungsobjekte unter die Schnittstelle IEnumerable, die wiederum hat ArrayList(Index-Value)) & HashTable(Key-Value). Nach .NET Framework 2.0, ArrayList & HashTable wurden mit ersetzt List & Dictionary. Jetzt die Arraylist & HashTable werden in heutigen Projekten nicht mehr verwendet.

Kommen zum Unterschied zwischen HashTable & Dictionary, Dictionary ist allgemein wo Hastable ist nicht generisch. Wir können jeder Art von Objekt hinzufügen HashTable, aber beim Abrufen müssen wir es auf den erforderlichen Typ umwandeln. Also, es ist nicht typsicher. Aber zu dictionaryWährend wir uns selbst deklarieren, können wir den Typ des Schlüssels und den Wert angeben, so dass beim Abrufen nicht gecastet werden muss.

Schauen wir uns ein Beispiel an:

Hash-tabelle

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);
        }

    }
}

Wörterbuch,

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



Wörterbuch:

  • Es gibt eine Ausnahme zurück, wenn wir versuchen, einen Schlüssel zu finden, der nicht existiert.

  • Es ist schneller als eine Hashtable, weil es kein Boxing und Unboxing gibt.

  • Nur öffentliche statische Mitglieder sind threadsicher.

  • Das Dictionary ist ein generischer Typ, was bedeutet, dass wir es mit jedem Datentyp verwenden können (Beim Erstellen müssen die Datentypen für Schlüssel und Werte angegeben werden).

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

  • Dictionay ist eine typsichere Implementierung von Hashtable, Keys und Values sind stark typisiert.

Hash-tabelle:

  • Es gibt null zurück, wenn wir versuchen, einen Schlüssel zu finden, der nicht existiert.

  • Es ist langsamer als das Wörterbuch, da es Boxen und Unboxing erfordert.

  • Alle Mitglieder in einem Hashtable sind Thread-sicher,

  • Hashtable ist kein generischer Typ,

  • Hashtable ist eine lose typisierte Datenstruktur, wir können Schlüssel und Werte eines beliebigen Typs hinzufügen.


14
2018-05-28 07:53