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


当前回答

Hashtable对象由包含集合元素的桶组成。bucket是Hashtable中元素的虚拟子组,这使得搜索和检索比大多数集合更容易和更快。

Dictionary类具有与Hashtable类相同的功能。对于值类型,特定类型(而不是Object)的字典比Hashtable具有更好的性能,因为Hashtable的元素属于Object类型,因此,如果存储或检索值类型,通常会进行装箱和取消装箱。

进一步阅读:哈希表和字典集合类型

其他回答

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

在.NET中,Dictionary<,>和HashTable之间的区别主要在于前者是一种泛型类型,因此在静态类型检查方面可以获得泛型的所有好处(以及减少装箱,但这并不像人们在性能方面所想的那么大-尽管装箱会有一定的内存成本)。

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

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

哈希表:

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

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

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

字典:HashTable的泛型变体。

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

字典:

如果我们试图找到不存在的键,它将返回/抛出异常。它比哈希表更快,因为没有装箱和拆箱。只有公共静态成员是线程安全的。字典是一种通用类型,这意味着我们可以将它与任何数据类型一起使用(创建时,必须为键和值指定数据类型)。示例:Dictionary<string,string><NameOfDictionaryVar>=新字典<string,string>();字典是Hashtable的类型安全实现,键和值是强类型的。

哈希表:

如果我们试图找到一个不存在的键,它将返回null。它比字典慢,因为它需要装箱和拆箱。Hashtable中的所有成员都是线程安全的,Hashtable不是泛型类型,哈希表是松散类型的数据结构,我们可以添加任何类型的键和值。