我试图弄清楚何时以及为什么使用Dictionary或HashTable。我在这里做了一些搜索,发现人们谈论我完全同意的《词典》的一般优势,这导致装箱和拆箱的优势略有提高。
但是我也读过Dictionary并不会总是按插入对象的顺序返回对象,而是对其进行排序。像HashTable一样。据我了解,这导致HashTable在某些情况下会快得多。
我的问题是,这些情况可能是什么?我在上面的假设中错了吗?您可能会使用哪种情况来选择另一种情况(是的,最后一种情况有点模棱两可)。
我试图弄清楚何时以及为什么使用Dictionary或HashTable。我在这里做了一些搜索,发现人们谈论我完全同意的《词典》的一般优势,这导致装箱和拆箱的优势略有提高。
但是我也读过Dictionary并不会总是按插入对象的顺序返回对象,而是对其进行排序。像HashTable一样。据我了解,这导致HashTable在某些情况下会快得多。
我的问题是,这些情况可能是什么?我在上面的假设中错了吗?您可能会使用哪种情况来选择另一种情况(是的,最后一种情况有点模棱两可)。
Answers:
System.Collections.Generic.Dictionary<TKey, TValue>
和System.Collections.Hashtable
类都在内部维护哈希表数据结构。它们都不能保证保留项目的顺序。
除了装箱/拆箱问题外,大多数情况下,它们应该具有非常相似的性能。
它们之间的主要结构差异是Dictionary
依靠链接(为每个哈希表存储桶维护一个项目列表)来解决冲突,而Hashtable
使用重新哈希化来解决冲突(当发生冲突时,尝试使用另一个哈希函数将键映射到存储桶) 。
Hashtable
如果您面向.NET Framework 2.0+ ,则使用类几乎没有好处。有效地使它过时了Dictionary<TKey, TValue>
。
Hashtable
。哈希表在一项中存储3条信息:密钥哈希,密钥本身和值。对于具有相等哈希值的项目,必须遍历列表以找到具有相同键的项目并返回其值。这几乎Hashtable
也是正确的。作为Dictionary
通常使用的开发人员,您无需担心。
另一个重要的区别是Hashtable类型同时支持无锁的多个读取器和一个写入器,而Dictionary不支持。
MSDN文章:“
Dictionary<TKey, TValue>
该类具有与该类相同的功能Hashtable
。Dictionary<TKey, TValue>
特定类型的A (而非Object
)比Hashtable
for值类型具有更好的性能 ,因为的元素Hashtable
属于类型Object
,因此,在存储或取消装箱时通常会进行装箱和拆箱检索值类型”。
链接:http://msdn.microsoft.com/en-us/library/4yh14awz(v = vs.90).aspx
另一个重要的区别Hashtable
是线程安全。Hashtable
内置了多个读取器/单个写入器(MR / SW)线程安全性,这意味着Hashtable
允许一个写入器与多个读取器一起使用而不会锁定。在Dictionary
没有线程安全的情况下,如果需要线程安全,则必须实现自己的同步。
详细说明:
Hashtable
,通过Synchronized属性提供一些线程安全性,该属性返回围绕集合的线程安全包装器。包装器通过在每个添加或删除操作上锁定整个集合来工作。因此,每个试图访问该集合的线程都必须等待其轮换获得一个锁。这是不可扩展的,并且可能导致大型集合的显着性能下降。此外,该设计也没有完全不受竞争条件的影响。.NET Framework 2.0中的集合类一样
List<T>
,Dictionary<TKey, TValue>
等不提供任何线程同步; 同时在多个线程上添加或删除项目时,用户代码必须提供所有同步。如果既需要类型安全又需要线程安全,请在.NET Framework中使用并发集合类。在这里进一步阅读。
如果您关心的是读取将始终按插入字典中的对象的顺序返回的对象,则可以查看一下
OrderedDictionary-可以通过整数索引访问值(按添加项目的顺序) SortedDictionary-项目自动排序
字典比哈希表更快,因为字典是通用的强类型。Hashtable较慢,因为它将对象作为数据类型,这导致装箱和拆箱。