在大多数编程语言中,字典比哈希表更受欢迎。这背后的原因是什么?
当前回答
在.NET中,Dictionary<,>和HashTable之间的区别主要在于前者是一种泛型类型,因此在静态类型检查方面可以获得泛型的所有好处(以及减少装箱,但这并不像人们在性能方面所想的那么大-尽管装箱会有一定的内存成本)。
其他回答
哈希表:
键/值将在存储到堆中时转换为对象(装箱)类型。
从堆中读取时,需要将键/值转换为所需的类型。
这些操作成本很高。我们需要尽可能避免装箱/拆箱。
字典:HashTable的泛型变体。
禁止装箱/拆箱。无需转换。
我能发现的另一个区别是:
我们不能在web服务中使用Dictionary<KT,VT>(泛型)。原因是没有web服务标准支持泛型标准。
自.NET Framework 3.5以来,还有一个HashSet<T>,它提供了字典<TKey,TValue>的所有优点,如果您只需要键而不需要值。
因此,如果您使用Dictionary<MyType,object>并始终将值设置为null以模拟类型安全哈希表,您可能应该考虑切换到HashSet<T>。
MSDN上的《使用C#对数据结构进行广泛检查》一文指出,冲突解决策略也存在差异:
Hashtable类使用一种称为rehashing的技术。
Rehashing的工作原理如下:有一组哈希不同的函数,H1。。。Hn,并且当从哈希中插入或检索项时表中,最初使用H1哈希函数。如果这导致如果需要,则尝试H2,然后继续到Hn。
字典使用了一种称为链接的技术。
通过重新散列,在发生冲突时,将重新计算哈希,并尝试与哈希对应的新槽。然而,通过链接,使用辅助数据结构来保存任何碰撞。具体来说,字典中的每个插槽都有一个数组映射到该存储桶的元素。如果发生碰撞冲突元素被添加到桶的列表中。
Dictionary<>是泛型类型,因此它是类型安全的。
您可以在HashTable中插入任何值类型,这有时可能会引发异常。但是Dictionary<int>只接受整数值,类似地Dictionary><string>只接受字符串。
因此,最好使用Dictionary<>而不是HashTable。
推荐文章
- 我如何使一个方法的返回类型泛型?
- 何时处理CancellationTokenSource?
- 如何在Java中打印二叉树图?
- 如何获取正在执行的程序集版本?
- AutoMapper vs valueinjector
- 为什么控制台不。Writeline,控制台。在Visual Studio Express中编写工作?
- 什么是.NET程序集?
- 字符串不能识别为有效的日期时间“格式dd/MM/yyyy”
- 函数应该返回空对象还是空对象?
- 如何转换日期时间?将日期时间
- 如何在c#中连接列表?
- 在c#中引用类型变量的“ref”的用途是什么?
- 防止在ASP中缓存。NET MVC中使用属性的特定操作
- 转换为值类型'Int32'失败,因为物化值为空
- c#中有任何连接字符串解析器吗?