最近翻开一下c#的基础书,发现c#的哈希表我重来没用过。
理解一番,觉得和dictionary有点相像,都是键值对(key-value)的形式。
网上查询了一番,下面说说简单介绍下哈希表Hashtable 。
哈希表(hashtable)和字典表(dictionary)效率对比:
Hashtable hashtable = new Hashtable();
Dictionary<string, int> dictionary = new Dictionary<string, int>();
int countNum = 1000000;
DateTime startTime;
DateTime endTime;
startTime = DateTime.Now;
for (int i = 0; i < countNum; i++)
{
hashtable.Add(i.ToString(), i);
}
endTime = DateTime.Now;
Console.WriteLine("给哈希表赋值:" + (endTime - startTime).Milliseconds); //输出: 796
startTime = DateTime.Now;
for (int i = 0; i < countNum; i++)
{
dictionary.Add(i.ToString(), i);
}
endTime = DateTime.Now;
Console.WriteLine("字典类型赋值:" + (endTime - startTime).Milliseconds); //输出: 448
startTime = DateTime.Now;
for (int i = 0; i < countNum; i++)
{
hashtable.ContainsKey(i.ToString());
}
endTime = DateTime.Now;
Console.WriteLine("输出哈希表值:" + (endTime - startTime).Milliseconds); //输出: 268
startTime = DateTime.Now;
for (int i = 0; i < countNum; i++)
{
dictionary.ContainsKey(i.ToString());
}
endTime = DateTime.Now;
Console.WriteLine("输出字典类型值:" + (endTime - startTime).Milliseconds); //输出: 183
结论:添加数据时,dictionary快,频繁调用数据时Dictionary快。Dictionary<K,V>是泛型的,当K或V是值类型时,其速度远远超过Hashtable。
由于 Hashtable 和 Dictionary 同时存在, 在使用场景上必然存在选择性, 并不任何时刻都能相互替代.
[1] 单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.
[2] 多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减.
[3] Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便.
不过有人认为:我认为应该始终使用Dictionary<K, V>,即使要用Hashtable了,也可以用Dictionary<object, object>来替代。