首先,哈希表和字典都是可以存储数据的一个容器,都是以键值对的方式来存储数据,一个键对应一个值,通过键和值来检索数据时是十分有效迅速的,举个简单的例子就是我们的手机的电话薄里面都是一个人对应一个电话号码,检索的时候只有找到键,也就是找到人名,就可以找到电话号码了。 字典的存储结构也是通过哈希表来实现的,所以两者存入数据的方式是一样的,但是两者在执行效率上还是有差别的。

一、Hashtable 哈希表

 

 

 存入数据不限制类型和数量,前提是导入命名空间using system.Collection
(1)存值时:
哈希表以键值对的形式存入数据(每个键对应一个值),
存值时不允许重复(key不能重复),
(2)取值时:
键值对的排列具有无序性;
取值时找key(键),value(值)与key对应;
显示数据要用foreach循环,foreach从开始循环到结束,中间不会停下。

 

 

public static void Main()
  {
     Hashtable ht = new Hashtable(); //创建一个Hashtable实例
     ht.Add("北京", "帝都");  //添加keyvalue键值对
     ht.Add("上海", "魔都");
     ht.Add("广州", "省会");
     ht.Add("深圳", "特区");
    foreach (object str in ht.Keys)   // 遍历哈希表,把所有数据以键值对的格式输出
            {
                Console.WriteLine("key{0},-----value{1}", str, ht[str]);
            }
     string capital = (string)ht["北京"];
     Console.WriteLine(ht.Contains("上海")); //判断哈希表是否包含特定键,其返回值为true或false
     ht.Remove("深圳"); //移除一个keyvalue键值对
     ht.Clear(); //移除所有元素
  }

 

二、字典:Dictionary  

 

(1) 和哈希表相似之处:

 

    Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值) 

 

    键必须是唯一的,而值不需要唯一的.

(2) 和哈希表的不同之处:  

    键和值的类型取决于定义字典时的设置类型。
    通过一个键读取一个值的时间是接近O(1) 
    键值对之间的偏序可以不定义 

 static void Main(string[] args)
        {
            //尖括号里面分别是key和value的类型
            Dictionary<string,string> dic=new Dictionary<string ,string>();   
            //和哈希表很像,无序的
            dic.Add("丽丽","乖乖");
            dic.Add("双双","懒蛋");
            dic.Add("少敏","沙皮");
            dic.Add("大大","逗比");
            dic.Add("小冉","学霸");
            foreach (string item in dic.Keys)      //遍历出key
            {
                Console.WriteLine("key{0},,,,,,value{1}",item,dic[item]);      //value值与key对应 ,也可以写成item.key,item.value
            }
            Console.ReadKey();
        }
        }

看一下输出的结果: 键和值的对应

 

 

 三、执行效率:    

    System.Collections下的哈希表(Hashtable)和System.Collections.Generic下的字典(Dictionary)都可用作lookup table,下面比较一下二者的执行效率。

Stopwatch sw = new Stopwatch();
Hashtable hashtable = new Hashtable();
Dictionary<string, int> dictionary = new Dictionary<string, int>();
int countNum = 1000000;

sw.Start();
for (int i = 0; i < countNum; i++)
{
    hashtable.Add(i.ToString(), i);
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);      //输出: 744

sw.Restart();
for (int i = 0; i < countNum; i++)
{
    dictionary.Add(i.ToString(), i);
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);  //输出: 489

sw.Restart();
for (int i = 0; i < countNum; i++)
{
    hashtable.ContainsKey(i.ToString());
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);  //输出: 245

sw.Restart();
for (int i = 0; i < countNum; i++)
{
    dictionary.ContainsKey(i.ToString());
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);  //输出: 192

 

总结:

 

   哈希表和字典在内容实现上比较相似,不同的是字典不需要装箱和拆箱操作,所以在添加数据时效率上高一点,但是在频繁调用数据时字典更快一些。

  还有一张图,是关于arraylist与list,hashtable,dictionary四者的关系与不同的,C#视频里面老师画的图,展示给大家

 

 

 

 

 

 

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐