.NET HashTable与字典 - 字典能否同样快?

时间:2009-07-06 20:46:23

标签: c# .net collections dictionary hashtable

我想弄清楚何时以及为何使用Dictionary或HashTable。我在这里做了一些搜索,并且发现人们在谈论字典的一般优点,我完全赞同,这导致拳击和拆箱优势,以获得轻微的性能提升。

但是我也读过字典并不总是按照它们插入的顺序返回对象,它被排序的东西。作为HashTable的地方。据我了解,这导致HashTable在某些情况下更快。

我的问题是,这些情况可能是什么?我上面的假设我错了吗?你可以用什么情况来选择一个在另一个之上,(是的,最后一个有点含糊不清)。

10 个答案:

答案 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)

Hashtable和Dictionary之间的差异

字典:

  • 如果我们尝试查找不存在的密钥,则会返回错误。
  • 字典比Hashtable更快,因为没有装箱和拆箱。
  • Dictionary是一种泛型类型,这意味着我们可以将它与任何数据类型一起使用。

哈希表:

  • 如果我们尝试查找不存在的密钥,则Hashtable返回null。
  • Hashtable比字典慢,因为它需要装箱和拆箱。
  • Hashtable不是通用类型,

答案 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较慢,因为它将对象作为数据类型,导致装箱和拆箱。