.NET哈希表Vs字典-字典能一样快吗?

我试图弄清楚什么时候以及为什么要使用字典或哈希表。我在这里做了一些搜索,发现人们在谈论Dictionary的一般优势,我完全同意这一点,它带来了装箱和拆箱的优势,从而获得了轻微的性能增益。

但我也读过字典不会总是按照插入的顺序返回对象,事情是有序的。就像哈希表一样。据我所知,这导致哈希表在某些情况下要快得多。

我的问题是,这些情况可能是什么?我上面的假设是错的吗?你会在什么情况下选择一个而不是另一个,(是的,最后一个有点模棱两可)。

202642 次浏览

System.Collections.Generic.Dictionary<TKey, TValue>System.Collections.Hashtable类都在内部维护一个哈希表数据结构。没有一个能保证保持物品的顺序。

撇开装箱/开箱问题不谈,大多数情况下,它们应该具有非常相似的性能。

它们之间主要的结构区别是Dictionary依赖于链接(为每个哈希表桶维护一个项目列表)来解决冲突,而Hashtable使用再处理来解决冲突(当发生冲突时,尝试另一个哈希函数将键映射到一个桶)。

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

两者实际上是同一个类(您可以查看反汇编)。HashTable是在。net有泛型之前创建的。Dictionary是一个泛型类,可以为您提供强大的类型优势。我永远不会使用哈希表,因为字典不需要你使用。

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

我猜这对你来说已经毫无意义了。只是为了供路过的人参考

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

内存分配:

内存使用性能测试

插入所用时间:

插入所用的时间

项目搜索时间:

Time for searching an item

字典比哈希表快,因为字典是泛型强类型。哈希表比较慢,因为它将对象作为数据类型,导致装箱和拆箱。

MSDN Article: " Dictionary<TKey, TValue>类有相同的 函数的Hashtable类。一个Dictionary<TKey, TValue> Object类型的对象(除Object之外)具有更好的性能 因为Hashtable的元素是 类型Object,因此,如果

.

.

链接:http://msdn.microsoft.com/en-us/library/4yh14awz (v =应用程序). aspx

如果你关心读取,它总是按照插入到Dictionary中的顺序返回对象,你可以看看

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

哈希表和字典的区别

字典:

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

散列表:

  • 如果我们试图找到一个不存在的键,哈希表返回null。
  • 哈希表比字典慢,因为它需要装箱和拆箱。
  • 哈希表不是泛型类型,

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

进一步说明:

Hashtable,通过Synchronized属性提供一些线程安全,该属性返回围绕集合的线程安全包装器。包装器的工作原理是在每次添加或删除操作时锁定整个集合。因此,试图访问集合的每个线程都必须等待轮到自己使用一个锁。这是不可伸缩的,并且对于大型集合可能会导致显著的性能下降。此外,该设计没有完全免受竞态条件的影响。

.NET Framework 2.0集合类如List<T>Dictionary<TKey, TValue>等不提供任何线程同步;当在多个线程上并发添加或删除项时,用户代码必须提供所有同步 如果你既需要类型安全又需要线程安全,可以在. net框架中使用并发集合类。

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