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

Jon*_*Jon 269 .net c# collections dictionary hashtable

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

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

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

Meh*_*ari 291

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

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

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

Hashtable如果您的目标是.NET Framework 2.0+,那么使用类几乎没有什么好处.它实际上已经过时了Dictionary<TKey, TValue>.

  • @ Jon-链接和重新讨论在这里深入讨论 - http://msdn.microsoft.com/en-us/library/ms379571(VS.80).aspx (21认同)
  • @Mehrdad - 关于碰撞是如何解决的我不清楚的是:如果多个键可能导致相同的散列,那么如何确保在查找中获得正确的值,即函数如何知道哪个元素到返回?在http://msdn.microsoft.com/en-us/library/ms379571%28VS.80%29.aspx中,它说:"而不是像碰撞一样发生碰撞,就像使用Hashtable类一样,字典只需将任何碰撞链接到桶的清单上." 这是否意味着在使用Dictionary时,碰撞不是开发人员必须担心的? (6认同)
  • @Howiecamp:这与`Hashtable`没什么不同.散列表在条目中存储3条信息:密钥散列,密钥本身和值.对于具有相同散列的项,它必须遍历列表以找到具有相等键的项并返回其值.对于`Hashtable`来说也是如此.作为通常使用`Dictionary'的开发人员,您不必担心它. (6认同)

Abd*_*nim 106

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

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

  • @JohnHenckel 不,排序列表的查找速度较慢。性能系数越大意味着性能越好,内存利用率也越高。因此,根据图表,排序列表具有最佳的内存使用率,但在插入和查找等其他方面却很糟糕。 (2认同)
  • 我对该图中单位的含义感到困惑。如果 Y 轴是“时间”,则较高的值应该是“更多时间”,但我自己的测试显示 SortedDictionary 比 Dictionary 慢得多。因此,也许添加一条消息“越高越好” (2认同)

use*_*704 28

Hashtable和Dictionary之间的差异

字典:

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

哈希表:

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


Ste*_*ven 23

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

  • 并发字典将支持(.Net 4.0) (8认同)

小智 15

MSDN文章:" Dictionary<TKey, TValue>该类具有与类相同的功能Hashtable.Dictionary<TKey, TValue> 特定类型(除了Object)之外的A具有比Hashtable用于值类型更好的性能 ,因为元素Hashtable是类型的Object,因此,装箱和取消装箱通常在存储时发生或检索值类型".

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


Ada*_*ter 11

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


Nul*_*nce 7

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

进一步阐述:

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

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