最近看到上述这样一个问题,觉得很有意思,也可能是很多初学者不理解的一个点,所以,今天,我们就来好好讨论一下,首先,我看来这个问题本身就含有一种歧义性,因为从某种意义上讲,Dictionary(在概念上)是一个哈希表。这样的话,这个问题就被无情的over了,那今天的分享岂不就这样结束了,但俺一贯秉持着只要在我身上花时间,就不让各位老爷空手而归的原则,我们就先把问题简单的改造一下,嘿嘿~……直接问题改为**“为什么我们使用Dictionary<TKey, TValue>类而不是Hashtable类?”**
或许这样就有了周旋的余地,所以接下来,我们就这个问题来探讨一下c#中的Dictionary
和Hashtable
。
开始前,我们还是先来看一下Dictionary
和Hashtable
的基本定义和使用:
var customers = new Dictionary<string, Customer>();
...
Customer customer = customers["Tom"];
var customers = new Hashtable();
...
Customer customer = customers["Tom"] as Customer;
好了,我们看一下二者的基本使用,现在该具体来认识一下这两位大佛了。
差异
Dictionary | Hashtable |
---|---|
泛型类型 | 非泛型类型 |
需要自行进行线程同步 | 通过Synchronized() 方法提供线程安全版本 |
枚举项:KeyValuePair | 枚举项:DictionaryEntry |
较新(>.NET 2.0) | 较旧(自.NET 1.0起) |
位于System.Collections.Generic 命名空间 | 位于System.Collections 命名空间 |
请求不存在的键会抛出异常 | 请求不存在的键会返回null |
对于值类型可能稍微快一些 | 对于值类型稍慢(需要装箱/拆箱) |
相似之处:
- 两者在内部都是哈希表 == 根据键快速访问多项数据
- 两者都需要不可变且唯一的键
- 两者的键都需要自己的
GetHashCode()
方法
.NET中的替代集合:(可用于替代Dictionary
和Hashtable
的候选项)
ConcurrentDictionary
- 线程安全(可以从多个线程并发安全地访问)
HybridDictionary
- 优化性能(适用于少量项目和大量项目)
OrderedDictionary
- 可以通过int索引(按项目添加的顺序)访问值
SortedDictionary
- 项目自动排序
StringDictionary
- 强类型,并针对字符串进行了优化(现已弃用,推荐使用Dictionary<string,string>
)
相信看完上面这些内容,你对Dictionary
和Hashtable
有了一个大概加亿点点全面的了解。所以最后我们再来做个简单的总结:
在实际开发中,由于Dictionary<TKey, TValue>
提供了类型安全、更好的性能和泛型支持,它通常比Hashtable
更受欢迎。然而,如果你正在处理遗留代码或特殊用例,Hashtable
可能仍然是一个可行的选择。在大多数情况下,推荐使用Dictionary
。
既然你已经带走了这么多的知识,不妨为俺这个小博主留下个小赞再离开吧~