Reputation: 15200
I am trying to figure out when and why to use a Dictionary
or a Hashtable
. I have done a bit of a search on here and have found people talking about the generic advantages of the Dictionary
which I totally agree with, which leads the boxing and unboxing advantage for a slight performance gain.
But I have also read the Dictionary
will not always return the objects in the order they are inserted, thing it is sorted. Where as a Hashtable
will. As I understand it this leads to the Hashtable
being far faster for some situations.
My question is really, what might those situations be? Am I just wrong in my assumptions above? What situations might you use to choose one above the other, (yes the last one is a bit ambiguous).
Upvotes: 298
Views: 212482
Reputation: 19217
I guess it doesn't mean anything to you now. But just for reference for people stopping by
Performance Test - SortedList vs. SortedDictionary vs. Dictionary vs. Hashtable
Memory allocation:
Time used for inserting:
Time for searching an item:
Upvotes: 132
Reputation: 59
Dictionaries have the advantage of being a generic type, which makes it type safe and a bit faster due to lack of need for boxing. The following comparison table (constructed using the answers found in a similar SO question post) illustrates some of the other reasons that support dictionaries over hash tables (or vice versa).
Upvotes: 2
Reputation: 2968
Another important difference is that Hashtable
is thread safe. Hashtable
has built in multiple reader/single writer (MR/SW) thread safety which means Hashtable
allows ONE writer together with multiple readers without locking. In the case of Dictionary
there is no thread safety, if you need thread safety you must implement your own synchronization.
To elaborate further:
Hashtable
, provide some thread-safety through the Synchronized property, which returns a thread-safe wrapper around the collection. The wrapper works by locking the entire collection on every add or remove operation. Therefore, each thread that is attempting to access the collection must wait for its turn to take the one lock. This is not scalable and can cause significant performance degradation for large collections. Also, the design is not completely protected from race conditions.The .NET Framework 2.0 collection classes like
List<T>
,Dictionary<TKey, TValue>
, etc do not provide any thread synchronization; user code must provide all synchronization when items are added or removed on multiple threads concurrently If you need type safety as well thread safety, use concurrent collections classes in the .NET Framework. Further reading here.
Upvotes: 9
Reputation: 181
MSDN Article: "The
Dictionary<TKey, TValue>
class has the same functionality as theHashtable
class. ADictionary<TKey, TValue>
of a specific type (other thanObject
) has better performance than aHashtable
for value types because the elements ofHashtable
are of typeObject
and, therefore, boxing and unboxing typically occur if storing or retrieving a value type".
Link: http://msdn.microsoft.com/en-us/library/4yh14awz(v=vs.90).aspx
Upvotes: 18
Reputation: 6202
Dictionary:
Hashtable:
Upvotes: 39
Reputation: 317
If you care about reading that will always return the objects in the order they are inserted in a Dictionary, you may have a look at
OrderedDictionary - values can be accessed via an integer index (by order in which items were added) SortedDictionary - items are automatically sorted
Upvotes: 1
Reputation: 39
Dictionary is faster than hashtable as dictionary is a generic strong type. Hashtable is slower as it takes object as data type which leads to boxing and unboxing.
Upvotes: 0
Reputation: 701
Another important difference is that the Hashtable type supports lock-free multiple readers and a single writer at the same time, while Dictionary does not.
Upvotes: 25
Reputation: 422250
System.Collections.Generic.Dictionary<TKey, TValue>
and System.Collections.Hashtable
classes both maintain a hash table data structure internally. None of them guarantee preserving the order of items.
Leaving boxing/unboxing issues aside, most of the time, they should have very similar performance.
The primary structural difference between them is that Dictionary
relies on chaining (maintaining a list of items for each hash table bucket) to resolve collisions whereas Hashtable
uses rehashing for collision resolution (when a collision occurs, tries another hash function to map the key to a bucket).
There is little benefit to use Hashtable
class if you are targeting for .NET Framework 2.0+. It's effectively rendered obsolete by Dictionary<TKey, TValue>
.
Upvotes: 319
Reputation: 2253
Both are effectively the same class (you can look at the disassembly). HashTable was created first before .Net had generics. Dictionary, however is a generic class and gives you strong typing benefits. I would never use HashTable since Dictionary costs you nothing to use.
Upvotes: 11