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


当前回答

注意,文档中说:“Dictionary<(Of<(TKey,TValue>)>)类是作为哈希表实现的”,而不是“Dictionary<(Of<(TKey,TValue>)>类是作为HashTable实现的”

字典没有实现为哈希表,但它是按照哈希表的概念实现的。由于使用了泛型,该实现与HashTable类无关,尽管微软内部可能使用了相同的代码,并用TKey和TValue替换了Object类型的符号。

在.NET 1.0中,泛型不存在;这是HashTable和ArrayList最初开始的地方。

其他回答

仅供参考:在.NET中,Hashtable是线程安全的,可供多个读线程和一个写线程使用,而在Dictionary中,公共静态成员是线程安全,但不能保证任何实例成员都是线程安全。

因此,我们不得不将所有词典改回Hashtable。

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

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

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

Hashtable是一个松散类型的数据结构,因此您可以向Hashtable添加任何类型的键和值。Dictionary类是类型安全的Hashtable实现,键和值是强类型的。创建字典实例时,必须为键和值指定数据类型。

哈希表:

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

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

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

字典:HashTable的泛型变体。

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

注意,文档中说:“Dictionary<(Of<(TKey,TValue>)>)类是作为哈希表实现的”,而不是“Dictionary<(Of<(TKey,TValue>)>类是作为HashTable实现的”

字典没有实现为哈希表,但它是按照哈希表的概念实现的。由于使用了泛型,该实现与HashTable类无关,尽管微软内部可能使用了相同的代码,并用TKey和TValue替换了Object类型的符号。

在.NET 1.0中,泛型不存在;这是HashTable和ArrayList最初开始的地方。