C# 之 Hashtable 与 Dictionary

   2016-07-13 0

  Dictionary<TKey, TValue> ()      Hashtable()

  第一、存储的数据类型

  Hashtable不是泛型的,不是类型安全的;Dictionary是泛型的,是类型安全的;

  Hashtable的键值都是Object类型的,但是Dictionary的键值的数据类型是可以指定的。

  也就是说如果往Hashtable里面存入Object以外的数据类型,则在取出该数据时,需要对其进行显示的类型转换,才能够正常使用。而Dictionary则没有这个问题。

  从这方面讲的话,Hashtable相当于Dictionary<Object,Object>

            Hashtable ht = new Hashtable();
            Dictionary<string, int> dic = new Dictionary<string, int>();
            ht.Add("A", 1);
            dic.Add("A", 1);
            //Console.WriteLine(ht["A"]+1);     //编译错误!Object类型不能和int类型直接进行相加。
              Console.WriteLine((int)ht["A"] + 1);//编译通过,输出结果为:2
            Console.WriteLine(dic["A"] + 1);    //编译通过,输出结果为:2

  第二、读取数据的顺序与添加数据的顺序的一致性

  Dictionary和Hashtable的读取数据的顺序和添加数据时的数据的顺序的一致性均不能够保证,或者可以说没有一致性。

  Dictionary在只添加不删除的时候能够保持读取数据的顺序和添加时候的顺序是一致的;

  但是经过删除和添加操作之后,就不能够保证读取数据的顺序和添加时候的顺序一致了。

Dictionary<int, int> dic = new Dictionary<int, int>();
            dic.Add(0, 0);
            dic.Add(1, 1);
            dic.Add(2, 2);

            Console.WriteLine("仅仅经过添加元素处理之后:");

            foreach (KeyValuePair<int, int> kvp in dic)
            {
                Console.WriteLine("Key:" + kvp.Key + " Value:" + kvp.Value);
            }

            dic.Remove(0);
            dic.Add(3, 3);

            Console.WriteLine("经过删除和添加元素处理之后:");

            foreach (KeyValuePair<int, int> kvp in dic)
            {
                Console.WriteLine("Key:" + kvp.Key + " Value:" + kvp.Value);
            }

            Console.ReadKey();

捕获

  对于Dicitionary而言,如果从中删除一个元素,则之后新添加的元素会填补这个被删除元素的位置,因而致使添加数据的顺序与读取数据的顺序是不一致的。

  对于Hashtable而言,它的数据存储顺序是按一定的算法算出来的,所以绝大多数情况下,它的数据读取顺序和数据添加顺序是不一致的。

  所以如果你需要保持数据添加时的顺序的时候,最好不要用Dictionary和Hashtable。

  第三、当用一个不存在的Key值到Hashtable或者Dictionary中取值时

  对于Hashtable而言,如果用一个不存在的Key值进行取值的话,会返回一个null;

            Hashtable ht = new Hashtable();
            Console.WriteLine(ht["b"]==null);
            Console.ReadKey();

捕获

  对于Dictionary而言,如果用一个不存在的Key值进行取值的话,会引发“System.Collections.Generic.KeyNotFoundException”类型的异常。

  所以在从Dictionary或者Hashtable取值时,可以先判断Key值是否存在(用ContainsKey()方法进行判断),以防止出现预期以外的值或者异常。

  第四、线程安全性

  Dictionary不是线程安全的,Hashtable是线程安全的。

 
标签: Hashtable
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

点击排行