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


当前回答

Dictionary<>是泛型类型,因此它是类型安全的。

您可以在HashTable中插入任何值类型,这有时可能会引发异常。但是Dictionary<int>只接受整数值,类似地Dictionary><string>只接受字符串。

因此,最好使用Dictionary<>而不是HashTable。

其他回答

MSDN上的《使用C#对数据结构进行广泛检查》一文指出,冲突解决策略也存在差异:

Hashtable类使用一种称为rehashing的技术。

Rehashing的工作原理如下:有一组哈希不同的函数,H1。。。Hn,并且当从哈希中插入或检索项时表中,最初使用H1哈希函数。如果这导致如果需要,则尝试H2,然后继续到Hn。

字典使用了一种称为链接的技术。

通过重新散列,在发生冲突时,将重新计算哈希,并尝试与哈希对应的新槽。然而,通过链接,使用辅助数据结构来保存任何碰撞。具体来说,字典中的每个插槽都有一个数组映射到该存储桶的元素。如果发生碰撞冲突元素被添加到桶的列表中。

我能发现的另一个区别是:

我们不能在web服务中使用Dictionary<KT,VT>(泛型)。原因是没有web服务标准支持泛型标准。

在大多数编程语言中,字典优先于哈希表

我认为这不一定是真的,大多数语言都有这两种语言,这取决于他们喜欢的术语。

然而,在C#中,很明显的原因(对我来说)是C#HashTables和System.Collections命名空间的其他成员在很大程度上已经过时了。它们出现在c#V1.1中。它们已从C#2.0替换为System.Collections.Generic命名空间中的Generic类。

哈希表:

键/值将在存储到堆中时转换为对象(装箱)类型。

从堆中读取时,需要将键/值转换为所需的类型。

这些操作成本很高。我们需要尽可能避免装箱/拆箱。

字典:HashTable的泛型变体。

禁止装箱/拆箱。无需转换。

自.NET Framework 3.5以来,还有一个HashSet<T>,它提供了字典<TKey,TValue>的所有优点,如果您只需要键而不需要值。

因此,如果您使用Dictionary<MyType,object>并始终将值设置为null以模拟类型安全哈希表,您可能应该考虑切换到HashSet<T>。