一、什么是Hashtable
Hashtable,中文叫哈希表。它里面的英文Hash,音译是哈希。但Hash还有另一个翻译,就是“散列”,所以也叫散列表。
Hashtable是一个集合。集合是数据结构的一种,数据结构有集合、线性、树形、图形等。
Hashtable可用于存储键值对。
二、C#中如何声明一个Hashtable
您直接new一个Hashtable对象即可,如下所示:
Hashtable hashtable = new Hashtable();
三、如何添加和删除
通过Add和Remove方法可以给Hashtable添加或者删除项。
Hashtable hashtable = new Hashtable();
hashtable.Add("1x1", "1");
hashtable.Add("2x2", "4");
hashtable.Add("3x3", "9");
hashtable.Remove("3x3");
四、如何遍历
Hashtable的每个项是DictionaryEntry对象,如下:
foreach (DictionaryEntry entry in hashtable)
{
Console.WriteLine(entry.Key + " 得 " + entry.Value);
}
运行一下,代码输出结果如下图:
为什么不显示:3x3 得 9?因为此项被我们Remove删除掉了。
五、判断是否包含有某项
使用Contains方法进行处理:
if (hashtable.Contains("3x3"))
{
Console.WriteLine("包含3x3项");
}
else
{
Console.WriteLine("不 包含3x3项");
}
演示示例所用的完整源码如下:
static void Main(string[] args)
{
Hashtable hashtable = new Hashtable();
hashtable.Add("1x1", "1");
hashtable.Add("2x2", "4");
hashtable.Add("3x3", "9");
hashtable.Remove("3x3");
foreach (DictionaryEntry entry in hashtable)
{
Console.WriteLine(entry.Key + " 得 " + entry.Value);
}
if (hashtable.Contains("3x3"))
{
Console.WriteLine("包含3x3项");
}
else
{
Console.WriteLine("不 包含3x3项");
}
}
六、线程安全的Hashtable如何创建
如上图,通过静态方法Synchronized(Hashtable table)来创建,编写代码类似如下:
Hashtable hashtable = System.Collections.Hashtable.Synchronized(new Hashtable());
当然,您也可以使用lock关键来实现,但它本身已经具有方法了,您确定还需要自己再用lock写一遍吗?
七、与Dictionary的一些差异
1.Dictionary是类型安全的,即指它不需要装箱拆箱等操作。
2.Hashtable是线程安全的。但Dictionary不是,即指在多线程下,它的值无法确保同步。
可能有些没遇到过这种情况的初学者不好理解线程安全的意思,在多线程时,a、b两条线程都访问同一个Dictionary对象,在a线程中,会不断的因为业务操作,去修改Dictionary对象的值,而b线程想要时刻获取这些值,以为得到的跟a改变后的是一样的,但实际却不同。这就是线程安全的意思。
类型安全,是指装箱拆箱,即把对象转为object,或者把object转为对象。
3.在读取速度方面,Dictionary要快一些,原因可能是装箱拆箱的损耗。因为Hashtable不是类型安全的。
4.本质都是数据结构中的集合。数据结构分逻辑结构和物理结构,设计结构的计算方式我们叫算法。
5.Dictionary支持泛型,目前Hashtable是不支持的。
6.Hashtable是无序的,读取时,它并不按照你加入的先后顺序读出来。但Dictionary则是按你加入的先后顺序读取的。
祝您用餐愉快。