协慌网

登录 贡献 社区

为什么 Dictionary 优先于 C#中的 Hashtable?

在大多数编程语言中,字典比散列表更受欢迎。这背后的原因是什么?

答案

对于它的价值,一个字典概念)的哈希表。

如果你的意思是 “为什么我们使用Dictionary<TKey, TValue>类而不是Hashtable类?”,那么这是一个简单的答案: Dictionary<TKey, TValue>是泛型类型, Hashtable不是。这意味着您可以使用Dictionary<TKey, TValue>获得类型安全性,因为您无法在其中插入任何随机对象,并且您不必转换所取出的值。

有趣的是,.NET Framework 中的Dictionary<TKey, TValue>实现基于Hashtable ,您可以从源代码中的注释中看出:

通用词典是从 Hashtable 的源代码复制而来的

资源

Dictionary <<<>>> Hashtable差异:

  • 通用 <<<>>> 非通用
  • 需要自己的线程同步 <<<>>> 通过Synchronized()方法提供线程安全版本
  • 枚举项: KeyValuePair <<<>>> 枚举项: DictionaryEntry
  • 较新(> 。NET 2.0 )<<<>>> 较旧(自.NET 1.0 起
  • System.Collections.Generic <<<>>> 在System.Collections 中
  • 请求不存在的键抛出异常 <<<>>> 对不存在的键的请求返回 null
  • 对于值类型, <<<>>> 可能会更慢一点 (需要装箱 / 取消装箱)

Dictionary / Hashtable相似:

  • 两者都是内部哈希表 == 根据键快速访问多项数据
  • 两者都需要不可变和唯一的密钥
  • 两者的密钥都需要拥有GetHashCode()方法

类似的 .NET 集合(候选使用而不是 Dictionary 和 Hashtable):

  • ConcurrentDictionary - 线程安全 (可以同时从多个线程安全地访问)
  • HybridDictionary - 优化的性能 (适用于少数项目以及许多项目)
  • OrderedDictionary - 可以通过 int index 访问值(按添加项目的顺序)
  • SortedDictionary - 项目自动排序
  • StringDictionary - 强类型并针对字符串进行优化

因为Dictionary是一个泛型类( Dictionary<TKey, TValue> ),所以访问它的内容是类型安全的(即你不需要像使用Hashtable一样从Object )。

相比

var customers = new Dictionary<string, Customer>();
...
Customer customer = customers["Ali G"];

var customers = new Hashtable();
...
Customer customer = customers["Ali G"] as Customer;

但是, Dictionary在内部实现为哈希表,因此从技术上讲它的工作方式相同。