Próbuję dowiedzieć się, kiedy i dlaczego korzystać ze słownika lub tabeli HashTable. Przeprowadziłem tutaj trochę wyszukiwania i znalazłem ludzi mówiących o ogólnych zaletach Słownika, z którymi całkowicie się zgadzam, co prowadzi do przewagi nad boksem i rozpakowaniem dla niewielkiego wzrostu wydajności.
Ale przeczytałem również, że Słownik nie zawsze zwróci obiekty w kolejności, w jakiej zostały wstawione, co jest posortowane. Gdzie będzie jak HashTable. Jak rozumiem, prowadzi to do tego, że HashTable jest znacznie szybszy w niektórych sytuacjach.
Moje pytanie jest naprawdę, jakie mogą być te sytuacje? Czy po prostu mylę się w powyższych założeniach? Jakie sytuacje możesz wykorzystać, aby wybrać jedną z nich (tak, ta ostatnia jest nieco niejednoznaczna).
Odpowiedzi:
System.Collections.Generic.Dictionary<TKey, TValue>
aSystem.Collections.Hashtable
obie klasy wewnętrznie utrzymują strukturę danych tabeli skrótów. Żadna z nich nie gwarantuje zachowania kolejności produktów.Pomijając problemy z boksem / rozpakowaniem, przez większość czasu powinny one mieć bardzo podobną wydajność.
Podstawowa różnica strukturalna między nimi
Dictionary
polega na łączeniu łańcuchów (utrzymywanie listy elementów dla każdego segmentu tabeli skrótów) w celu rozstrzygania kolizji, a podczas ponownego rozwiązywania kolizji jestHashtable
stosowane ponowne użycie skrótu (gdy występuje kolizja, próbuje innej funkcji skrótu mapować klucz do segmentu) .Korzystanie z
Hashtable
klasy jest niewielkie, jeśli kierujesz reklamy na platformę .NET Framework 2.0+. Jest skutecznie dezaktualizowany przezDictionary<TKey, TValue>
.źródło
Hashtable
. Tabele skrótów przechowują we wpisie 3 informacje: skrót klucza, sam klucz i wartość. W przypadku elementów z jednakowym skrótem będzie musiał przejść przez listę, aby znaleźć element z równym kluczem i zwrócić jego wartość. Jest to również w dużej mierze prawdziweHashtable
. Jako programista używającyDictionary
normalnie, nie musisz się tym martwić.Myślę, że teraz to nic dla ciebie nie znaczy. Ale tylko w celach informacyjnych dla osób zatrzymujących się w pobliżu
Test wydajności - SortedList vs. SortedDictionary vs. Dictionary vs. Hashtable
Przydział pamięci:
Czas wykorzystany na wstawienie:
Czas na wyszukiwanie przedmiotu:
źródło
Różnice między tabelą skrótów a słownikiem
Słownik:
Hashtable:
źródło
Inną ważną różnicą jest to, że typ Hashtable obsługuje jednocześnie wiele czytników i jednego pisarza bez blokady, podczas gdy Słownik nie.
źródło
Link: http://msdn.microsoft.com/en-us/library/4yh14awz(v=vs.90).aspx
źródło
Oba są faktycznie tej samej klasy (możesz spojrzeć na demontaż). HashTable został stworzony, zanim .Net miał generyczne. Słownik jest jednak klasą ogólną i daje duże korzyści w zakresie pisania. Nigdy nie użyłbym HashTable, ponieważ słownik nie kosztuje nic do użycia.
źródło
Inną ważną różnicą jest to, że
Hashtable
jest wątkowo bezpieczny.Hashtable
ma wbudowane zabezpieczenie wątku wielu czytników / pojedynczych pisarzy (MR / SW), co oznacza, żeHashtable
JEDEN pisarz może współpracować z wieloma czytnikami bez blokowania. W przypadkuDictionary
braku bezpieczeństwa wątku, jeśli potrzebujesz bezpieczeństwa wątku, musisz wdrożyć własną synchronizację.Aby rozwinąć dalej:
źródło
Słowniki mają tę zaletę, że są typem ogólnym, co sprawia, że jest on bezpieczny i nieco szybszy z powodu braku potrzeby boksowania. Poniższa tabela porównawcza (skonstruowana przy użyciu odpowiedzi znalezionych w podobnym pytaniu SO ) ilustruje niektóre inne powody, dla których słowniki obsługują tabele skrótów (lub odwrotnie).
źródło
Jeśli zależy ci na czytaniu, które zawsze zwrócą obiekty w kolejności, w jakiej zostały wstawione do słownika, możesz rzucić okiem
OrdersDictionary - dostęp do wartości można uzyskać za pomocą indeksu liczb całkowitych (według kolejności, w której elementy zostały dodane) SortedDictionary - elementy są automatycznie sortowane
źródło
Słownik jest szybszy niż hashtable, ponieważ słownik jest silnym typem ogólnym. Hashtable działa wolniej, ponieważ przyjmuje obiekt jako typ danych, co prowadzi do boksu i rozpakowania.
źródło