it-swarm.asia

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

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

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

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

263
Jon

System.Collections.Generic.Dictionary<TKey, TValue>System.Collections.Hashtable类都在内部维护哈希表数据结构。 它们都不保证保留项目的顺序。

抛开拳击/拆箱问题,大多数时候,他们应该有非常相似的表现。

它们之间的主要结构差异是Dictionary依赖于 chaining (维护每个哈希表桶的项目列表)来解决冲突,而Hashtable使用 rehashing 用于冲突解决(碰撞时)发生时,尝试另一个哈希函数将密钥映射到存储桶)。

如果您的目标是.NET Framework 2.0+,那么使用Hashtable类几乎没有什么好处。它被Dictionary<TKey, TValue>有效地废弃了。

287
Mehrdad Afshari

我想这对你来说没什么意义。但仅供参考人员停留

性能测试 - SortedList vs. SortedDictionary vs. Dictionary vs. Hashtable

105
Abdul Munim

Hashtable和Dictionary之间的差异

字典:

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

哈希表:

  • 如果我们试图找到一个不存在的密钥,Hashtable将返回null。
  • Hashtable比字典慢,因为它需要装箱和拆箱。
  • Hashtable不是通用类型,
28
user2771704

另一个重要区别是Hashtable类型同时支持无锁多个读取器和单个写入器,而Dictionary则不支持。

23
Steven

MSDN文章:“Dictionary<TKey, TValue>类与Hashtable类具有相同的功能。特定类型的Dictionary<TKey, TValue>Object除外)对于值类型具有比Hashtable更好的性能,因为Hashtable的元素属于Object类型,因此,装箱如果存储或检索值类型,通常会发生取消装箱“。

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

15
Juan Camilo Caro J.

两者实际上是同一个类(你可以看一下反汇编)。 HashTable是在.Net拥有泛型之前创建的。然而,词典是一个通用类,为您提供强大的输入优势。我永远不会使用HashTable,因为Dictionary会让你无需使用。

11
Adam Luter

另一个重要的区别是Hashtable是线程安全的。 Hashtable内置了多个读取器/单个写入器(MR/SW)线程安全,这意味着Hashtable允许一个编写器与多个读取器一起使用而无需锁定。在Dictionary的情况下,没有线程安全性,如果需要线程安全,则必须实现自己的同步。

进一步阐述:

Hashtable,通过Synchronized属性提供一些线程安全性,该属性返回集合周围的线程安全包装器。包装器通过在每次添加或删除操作时锁定整个集合来工作。因此,尝试访问集合的每个线程必须等待轮到一个锁。这不可扩展,可能会导致大型集合的性能显着下降。此外,该设计并未完全免受竞争条件的影响。

.NET Framework 2.0集合类(如List<T>Dictionary<TKey, TValue>等)不提供任何线程同步;用户代码必须在多个线程上同时添加或删除项目时提供所有同步如果您需要类型安全性以及线程安全性,请在.NET Framework中使用并发集合类。进一步阅读这里。

7
NullReference

字典具有通用类型的优点,由于不需要装箱,因此类型安全且速度更快。以下 比较表 (使用在类似SO 问题帖子中找到的答案构建 )说明了支持字典对哈希表的一些其他原因(反之亦然)。

2
janeon

如果您关心阅读将始终按照它们插入词典中的顺序返回对象,您可以查看

OrderedDictionary - 值可以通过整数索引(按添加项目的顺序)访问 SortedDictionary - 项目自动排序

1
ToXinE