.NET的HashTable Vs字典 – 字典可以一样快吗?
我想弄清楚什么时候以及为什么要使用Dictionary或HashTable。 我在这里做了一些search,发现人们在谈论“词典”的通用优势,我完全同意这个观点,这个优势在拳击和拆箱方面略有提升。
但是我也读了Dictionary,它并不总是按照它们插入的顺序返回对象,它对它进行sorting。 作为一个HashTable将在哪里。 据我所知,这导致HashTable在某些情况下快得多。
我的问题是,这些情况可能是什么? 我在上面的假设中错了吗? 你可以用什么样的情况来select一个在另一个之上,(是的,最后一个是有点模糊的)。
System.Collections.Generic.Dictionary<TKey, TValue>
和System.Collections.Hashtable
类都在内部维护一个哈希表数据结构。 他们中没有人保证保存项目的顺序。
抛开拳击/拆箱问题,大多数时候,他们应该有非常相似的performance。
它们之间的主要结构区别在于, Dictionary
依赖于链接 (为每个哈希表存储桶维护一个项目列表)来解决冲突,而Hashtable
使用重新哈希来冲突解决(当发生冲突时,尝试另一个哈希函数将密钥映射到桶)。
如果您的目标是.NET Framework 2.0+,那么使用Hashtable
类几乎没有什么好处。 它被Dictionary<TKey, TValue>
有效地渲染。
我想现在对你来说没有任何意义。 但仅供参考
性能testing – SortedList与SortedDictionary与字典与哈希表
另一个重要的区别是Hashtabletypes支持同时locking多个阅读器和一个作者,而Dictionary不支持。
哈希表和字典之间的区别
字典:
- 如果我们试图find一个不存在的键,字典会返回错误。
- 由于没有装箱和拆箱,字典比散列表更快。
- 字典是一个genericstypes,这意味着我们可以使用任何数据types。
哈希表:
- 如果我们试图find一个不存在的键,Hashtable返回null。
- 哈希表比字典慢,因为它需要装箱和拆箱。
- 哈希表不是genericstypes,
MSDN文章:“
Dictionary<TKey, TValue>
类与Hashtable
类具有相同的function,特定types(Object
除外)的Dictionary<TKey, TValue>
比值types的Hashtable
具有更好的性能,因为Hashtable
的types为Object
,因此,如果存储或检索值types,通常会发生装箱和拆箱“。
链接: http : //msdn.microsoft.com/en-us/library/4yh14awz(v=vs.90).aspx
两者实际上是相同的类(你可以看看反汇编)。 .net有generics之前创build了HashTable。 词典,但是是一个通用的类,并给你强大的打字好处。 我不会使用HashTable,因为Dictionary不需要使用任何东西。
另一个重要的区别是Hashtable
是线程安全的。 Hashtable
内置了多个读写器(MR / SW)的线程安全性,这意味着Hashtable
允许一个写入器与多个读卡器一起不locking。 在Dictionary
的情况下没有线程安全性,如果您需要线程安全性,则必须实现自己的同步。
进一步阐述:
Hashtable
通过Synchronized属性提供了一些线程安全性,它在集合周围返回一个线程安全的封装。 包装器通过在每个添加或删除操作上locking整个集合而工作。 因此,试图访问集合的每个线程都必须等待轮到锁。 这不可扩展,并可能导致大型集合显着的性能下降。 而且,这种devise也没有完全免受竞赛的影响。.NET Framework 2.0集合类(如
List<T>
,Dictionary<TKey, TValue>
等)不提供任何线程同步; 用户代码必须在多个线程同时添加或删除项目时提供所有同步如果您需要types安全以及线程安全性,请使用.NET Framework中的并发集合类。 进一步阅读这里。
如果你关心阅读,总会按照他们插入到Dictionary中的顺序返回对象,你可以看看
OrderedDictionary – 可以通过整数索引(按顺序添加项目)访问值SortedDictionary – 项目自动sorting
字典比散列表快,因为字典是一个通用的强types。 哈希表比较慢,因为它将数据types作为导致装箱和拆箱的对象。