我想弄清楚何时以及为何使用Dictionary或HashTable。我在这里做了一些搜索,并且发现人们在谈论字典的一般优点,我完全赞同,这导致拳击和拆箱优势,以获得轻微的性能提升。
但是我也读过字典并不总是按照它们插入的顺序返回对象,它被排序的东西。作为HashTable的地方。据我了解,这导致HashTable在某些情况下更快。
我的问题是,这些情况可能是什么?我上面的假设我错了吗?你可以用什么情况来选择一个在另一个之上,(是的,最后一个有点含糊不清)。
答案 0 :(得分:287)
System.Collections.Generic.Dictionary<TKey, TValue>
和System.Collections.Hashtable
类都在内部维护哈希表数据结构。 他们都不保证保留商品的顺序。
抛开拳击/拆箱问题,大多数时候,他们应该有非常相似的表现。
它们之间的主要结构差异是Dictionary
依赖于链接(维护每个哈希表桶的项列表)来解决冲突,而Hashtable
使用 rehashing 用于冲突解决(发生冲突时,尝试使用另一个哈希函数将密钥映射到存储桶)。
如果您的目标是.NET Framework 2.0+,那么使用Hashtable
类几乎没有什么好处。它被Dictionary<TKey, TValue>
有效地废弃了。
答案 1 :(得分:105)
我想现在对你没什么意义。但仅供参考人员停车
Performance Test - SortedList vs. SortedDictionary vs. Dictionary vs. Hashtable
答案 2 :(得分:28)
字典:
哈希表:
答案 3 :(得分:23)
另一个重要区别是Hashtable类型同时支持无锁多个阅读器和单个编写器,而Dictionary则不支持。
答案 4 :(得分:15)
MSDN文章:“
Dictionary<TKey, TValue>
类具有相同的内容 作为Hashtable
类的功能。一个Dictionary<TKey, TValue>
特定类型(Object
除外)具有比a更好的性能Hashtable
代表值类型,因为Hashtable
的元素属于。{1}} 键入Object
因此,装箱和取消装箱通常会发生 存储或检索值类型“。
链接:http://msdn.microsoft.com/en-us/library/4yh14awz(v=vs.90).aspx
答案 5 :(得分:11)
两者实际上是同一个类(你可以看一下反汇编)。 HashTable是在.Net拥有泛型之前创建的。然而,词典是一个通用类,为您提供强大的输入优势。我永远不会使用HashTable,因为Dictionary会让你无需使用。
答案 6 :(得分:7)
另一个重要区别是Hashtable
是线程安全的。 Hashtable
内置了多个读取器/单个写入器(MR / SW)线程安全性,这意味着Hashtable
允许一个编写器与多个读取器一起使用而无需锁定。如果Dictionary
没有线程安全,如果您需要线程安全,则必须实现自己的同步。
进一步阐述:
Hashtable
,通过Synchronized属性提供一些线程安全性,该属性返回集合周围的线程安全包装器。包装器通过在每次添加或删除操作时锁定整个集合来工作。因此,尝试访问集合的每个线程必须等待轮到一个锁。这不可扩展,可能会导致大型集合的性能显着下降。此外,该设计并未完全免受竞争条件的影响。.NET Framework 2.0集合类(如
List<T>
,Dictionary<TKey, TValue>
等)不提供任何线程同步;用户代码必须在多个线程上同时添加或删除项目时提供所有同步 如果您需要类型安全性以及线程安全性,请在.NET Framework中使用并发集合类。进一步阅读。
答案 7 :(得分:2)
字典的优点是具有通用类型,这使得它的类型安全,并且由于不需要装箱而使其速度更快。以下comparison table(使用在类似的question post中找到的答案构造)说明了支持哈希表字典的其他一些原因(反之亦然)。
答案 8 :(得分:1)
如果你关心阅读总是会按照它们插入字典的顺序返回对象,你可以查看
OrderedDictionary - 可以通过整数索引(按添加项目的顺序)访问值 SortedDictionary - 项目会自动排序
答案 9 :(得分:-1)
字典比哈希表更快,因为字典是一种通用的强类型。 Hashtable较慢,因为它将对象作为数据类型,导致装箱和拆箱。