在大多数编程语言中,字典比哈希表更受欢迎。这背后的原因是什么?
当前回答
Hashtable是一个松散类型的数据结构,因此您可以向Hashtable添加任何类型的键和值。Dictionary类是类型安全的Hashtable实现,键和值是强类型的。创建字典实例时,必须为键和值指定数据类型。
其他回答
因为Dictionary是一个泛型类(Dictionary<TKey,TValue>),所以访问其内容是类型安全的(即,不需要像Hashtable那样从Object转换)。
比较
var customers = new Dictionary<string, Customer>();
...
Customer customer = customers["Ali G"];
to
var customers = new Hashtable();
...
Customer customer = customers["Ali G"] as Customer;
然而,Dictionary在内部实现为哈希表,因此技术上它的工作方式相同。
Hashtable对象由包含集合元素的桶组成。bucket是Hashtable中元素的虚拟子组,这使得搜索和检索比大多数集合更容易和更快。
Dictionary类具有与Hashtable类相同的功能。对于值类型,特定类型(而不是Object)的字典比Hashtable具有更好的性能,因为Hashtable的元素属于Object类型,因此,如果存储或检索值类型,通常会进行装箱和取消装箱。
进一步阅读:哈希表和字典集合类型
从概念上讲,字典是一个哈希表。
如果你的意思是“为什么我们使用Dictionary<TKey,TValue>类而不是Hashtable类?”,那么答案很简单:Dictionary>TKey,TValue>是泛型类型,Hashtable不是。这意味着你可以通过Dictionary<TKey,TValue>获得类型安全性,因为你不能在其中插入任何随机对象,也不必强制转换你取出的值。
有趣的是,.NET Framework中的Dictionary<TKey,TValue>实现是基于Hashtable的,您可以从其源代码中的注释中看出:
通用字典已从Hashtable的源复制
来源
根据我使用.NET Reflector所看到的:
[Serializable, ComVisible(true)]
public abstract class DictionaryBase : IDictionary, ICollection, IEnumerable
{
// Fields
private Hashtable hashtable;
// Methods
protected DictionaryBase();
public void Clear();
.
.
.
}
Take note of these lines
// Fields
private Hashtable hashtable;
因此,我们可以确定DictionaryBase在内部使用HashTable。
人们说字典和哈希表是一样的。
这不一定是真的。哈希表是实现字典的一种方法。这是一个典型的例子,它可能是.NET中Dictionary类中的默认例子,但根据定义,它不是唯一的例子。
你同样可以使用链接列表或搜索树来实现字典,但它并没有那么高效(对于一些高效的度量)。
推荐文章
- 实体框架核心:在上一个操作完成之前,在此上下文中开始的第二个操作
- 如何为构造函数定制Visual Studio的私有字段生成快捷方式?
- 为什么Visual Studio 2015/2017/2019测试运行器没有发现我的xUnit v2测试
- 如何使用JSON确保字符串是有效的JSON。网
- AppSettings从.config文件中获取值
- 通过HttpClient向REST API发布一个空体
- 如何检查IEnumerable是否为空或空?
- 自动化invokerrequired代码模式
- 没有ListBox。SelectionMode="None",是否有其他方法禁用列表框中的选择?
- 在c#代码中设置WPF文本框的背景颜色
- 在c#中,什么是单子?
- c#和Java中的泛型有什么不同?和模板在c++ ?
- c#线程安全快速(est)计数器
- HyperLogLog算法是如何工作的?
- 如何将此foreach代码转换为Parallel.ForEach?