it-swarm.com.de

.NET HashTable Vs Dictionary - Kann das Wörterbuch so schnell sein?

Ich versuche herauszufinden, wann und warum ich ein Dictionary oder eine HashTable verwenden soll. Ich habe hier ein bisschen recherchiert und Leute gefunden, die über die generischen Vorteile des Wörterbuchs gesprochen haben, denen ich voll und ganz zustimme. Dies führt zum Vorteil des Boxens und Unboxens und zu einem leichten Leistungsgewinn.

Ich habe aber auch gelesen, dass das Dictionary die Objekte nicht immer in der Reihenfolge zurückliefert, in der sie eingefügt wurden, es sei denn, es ist sortiert. Wo als HashTable wird. So wie ich es verstehe, führt dies dazu, dass die HashTable in manchen Situationen viel schneller ist.

Meine Frage ist wirklich, wie könnten diese Situationen sein? Liege ich in meinen obigen Annahmen falsch? Welche Situationen könnten Sie verwenden, um eine über der anderen zu wählen (ja, die letzte ist ein bisschen mehrdeutig).

267
Jon

System.Collections.Generic.Dictionary<TKey, TValue> und System.Collections.Hashtable Klassen pflegen beide intern eine Hash-Tabellen-Datenstruktur. Keine von ihnen garantiert die Beibehaltung der Reihenfolge der Artikel.

Abgesehen von Box-/Unboxing-Problemen sollten sie meistens eine sehr ähnliche Leistung haben.

Der hauptsächliche strukturelle Unterschied zwischen ihnen besteht darin, dass Dictionary auf der Verkettung (Verwaltung einer Liste von Elementen für jeden Hash-Tabellen-Bucket) beruht, um Kollisionen aufzulösen wohingegen Hashtable erneutes Aufbereiten für die Auflösung von Kollisionen verwendet (wenn eine Kollision auftritt, versucht es eine andere Hash-Funktion, um den Schlüssel einem Bucket zuzuordnen).

Die Verwendung der Klasse Hashtable ist für .NET Framework 2.0+ von geringem Nutzen. Es ist effektiv obsolet gemacht von Dictionary<TKey, TValue>.

288
Mehrdad Afshari

Ich denke, es bedeutet dir jetzt nichts. Aber nur als Referenz für Leute, die vorbeischauen

Leistungstest - SortedList vs. SortedDictionary vs. Dictionary vs. Hashtable

106
Abdul Munim

Unterschiede zwischen Hashtable und Dictionary

Wörterbuch:

  • Das Wörterbuch gibt einen Fehler zurück, wenn versucht wird, einen nicht vorhandenen Schlüssel zu finden.
  • Wörterbuch schneller als eine Hashtabelle, da es kein Ein- und Auspacken gibt.
  • Das Wörterbuch ist ein generischer Typ, was bedeutet, dass wir ihn mit jedem Datentyp verwenden können.

Hash-tabelle:

  • Hashtable gibt null zurück, wenn wir versuchen, einen Schlüssel zu finden, der nicht existiert.
  • Hashtable langsamer als Dictionary, da es das Ein- und Auspacken erfordert.
  • Hashtable ist kein generischer Typ.
28
user2771704

Ein weiterer wichtiger Unterschied besteht darin, dass der Hashtable-Typ mehrere Leser und einen einzelnen Schreiber gleichzeitig ohne Sperre unterstützt, Dictionary jedoch nicht.

23
Steven

MSDN-Artikel: "Die Dictionary<TKey, TValue> Klasse hat die gleiche Funktionalität wie die Hashtable Klasse. EIN Dictionary<TKey, TValue> eines bestimmten Typs (außer Object) hat eine bessere Leistung als ein Hashtable für Werttypen, da die Elemente von Hashtable vom Typ Object und sind Daher tritt Boxing und Unboxing normalerweise auf, wenn ein Werttyp gespeichert oder abgerufen wird ".

Link: http://msdn.Microsoft.com/en-us/library/4yh14awz (v = vs.90) .aspx

15

Beide sind praktisch die gleiche Klasse (Sie können sich die Demontage ansehen). HashTable wurde zuerst erstellt, bevor .Net Generika hatte. Das Wörterbuch ist jedoch eine generische Klasse und bietet starke Tippvorteile. Ich würde HashTable niemals verwenden, da die Verwendung des Wörterbuchs nichts kostet.

11
Adam Luter

Ein weiterer wichtiger Unterschied ist, dass Hashtable threadsicher ist. Hashtable verfügt über eine integrierte Thread-Sicherheit für mehrere Reader/Single Writer (MR/SW). Dies bedeutet, dass Hashtable EINEN Writer zusammen mit mehreren Readern ohne Sperre zulässt. Im Fall von Dictionary gibt es keine Thread-Sicherheit. Wenn Sie Thread-Sicherheit benötigen, müssen Sie Ihre eigene Synchronisation implementieren.

Um weiter auszuarbeiten:

Hashtable bietet Thread-Sicherheit über die Synchronized-Eigenschaft, die einen thread-sicheren Wrapper um die Auflistung zurückgibt. Der Wrapper sperrt bei jedem Hinzufügen oder Entfernen die gesamte Sammlung. Daher muss jeder Thread, der versucht, auf die Auflistung zuzugreifen, warten, bis er an der Reihe ist, um die eine Sperre zu übernehmen. Dies ist nicht skalierbar und kann bei großen Sammlungen zu erheblichen Leistungseinbußen führen. Auch das Design ist nicht vollständig vor Rennbedingungen geschützt.

Die .NET Framework 2.0-Auflistungsklassen wie List<T>, Dictionary<TKey, TValue>, etc bieten keine Thread-Synchronisation; Der Benutzercode muss die gesamte Synchronisierung bereitstellen, wenn Elemente gleichzeitig in mehreren Threads hinzugefügt oder entfernt werden. Wenn Sie sowohl Typensicherheit als auch Threadsicherheit benötigen, verwenden Sie in .NET Framework Klassen für gleichzeitige Auflistungen. Lesen Sie hier weiter.

7
NullReference

Wörterbücher haben den Vorteil, dass sie ein generischer Typ sind, wodurch sie sicherer und schneller sind, da kein Boxen erforderlich ist. Das folgende Vergleichstabelle (erstellt anhand der Antworten in einem ähnlichen SO Frage posten ) veranschaulicht einige der anderen Gründe, die Wörterbücher über unterstützen Hash-Tabellen (oder umgekehrt).

2
janeon

Wenn Sie lesen möchten, dass die Objekte immer in der Reihenfolge zurückgegeben werden, in der sie in ein Wörterbuch eingefügt wurden, sollten Sie einen Blick darauf werfen

OrderedDictionary - Auf Werte kann über einen Ganzzahlindex zugegriffen werden (nach der Reihenfolge, in der Elemente hinzugefügt wurden) SortedDictionary - Elemente werden automatisch sortiert

1
ToXinE