C#:Hashtable和Dictionary

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是线程安全的。

C#:Hashtable和Dictionary,布布扣,bubuko.com

时间: 2024-10-26 18:21:58

C#:Hashtable和Dictionary的相关文章

C# 集合类 :(Array、 Arraylist、List、Hashtable、Dictionary、Stack、Queue)

我们用的比较多的非泛型集合类主要有 ArrayList类 和 HashTable类.我们经常用HashTable 来存储将要写入到数据库或者返回的信息,在这之间要不断的进行类型的转化,增加了系统装箱和拆箱的负担,14:31:45,例如我们需要在电子商务网站中存储用户的购物车信息(商品名,对应的商品个数)时,完全可以用 Dictionary<string, int> 来存储购物车信息,而不需要任何的类型转化. 1.数组是固定大小的,不能伸缩.虽然System.Array.Resize这个泛型方法

C# Hashtable vs Dictionary 学习笔记

Hashtable 和 Dictionary 存储的都是键值对,我的理解是Dictionary是Hashtable的泛型实现. Hashtable的键和值都是object类型.所以,key和value 都可以是不同类型的值.当把变量定义成Dictionary<object, object> dic时,表现上就和Hashtable一样了. class Program { static void Main(string[] args) { Hashtable ht = new Hashtable(

C#Hashtable与Dictionary性能

由于 Hashtable 和 Dictionary 同时存在, 在使用场景上必然存在选择性, 并不任何时刻都能相互替代.[1] 单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.[2] 多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语

(转)C#中键值对类型Hashtable与Dictionary比较和相关用法

最近在使用C#中的Hashtable与Dictionary的时候,想知道其区别,通过查找网络相关博客资料,作出下列总结. Hashtable与Dictionary虽然都是作为键值对的载体,但是采用的是不同的数据结构.就像Java中的ArrayList与LinkList,虽然都是实现了List接口作为集合载体,但是其内部结构是不一样的,ArrayList是通过数组实现的,LinkList是通过对象链表实现的. 由于 Hashtable 和 Dictionary 同时存在, 在使用场景上必然存在选择

HashTable 和Dictionary的区别

黑马程序员--鄢振东 ---------------------- ASP.Net+Unity3D游戏开发..Net培训.期待与您交流! ---------------------- 首先hashtable和Dictionary这2个都是属于字典类,就是键值对集合. 相同点:我们都可以对其进行添加键值对  用add() 函数.和addrange()函数. 还有移除move moverange moveat      还有通过 键 去找  值. 不同点:对于值类型,特定类型(不包括 Object)

深入解析Hashtable、Dictionary、SortedDictionary、SortedList

我们先看Hashtable. MSDN的解释:表示键/值对的集合,这些键/值对根据键的哈希代码进行组织. Hash算法是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不 同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值. Hashtable 对象由包含集合元素的存储桶组成.存储桶是 Hashtable 中各元素的虚拟子组,与大多数集合中进行的搜索和检

C#中的HashSet, HashTable, Dictionary的区别【转】

HashSet和Python中的Set差不多,都是为逻辑运算准备的,HashSet不允许数据有重复,且存入的时单值不是键值对. HashTable和Dictionary差不多,但是他们的实现方式时不同的,Dictionary俗称字典,里面存放的时键值对,即KeyValuePair,且支持泛型,而HashTable国内一般译为哈希表,但是在我看来,为了更好表达它的本质,翻译为散列表比较好,因为HashTable里面村的key时以散列的方式存储的,但是Dictionary里面是按顺序的方式存的Key

HashTable和Dictionary的区别

1.hashtable表示键值对的集合.在.net framework中,hashtable是system.collection命名空间提供的一个容器,用于处理和表现类似key-value的键值对,其中key通常可用来快速查找,同时key区分大小写:value用于存储对应于key的值.hashtable中key-value键值对均为object类型,所以hashtable可以支持任何类型的key-value键值对,任何非null对象都可以作为键和值. 在哈希表中添加一个key键值对:hashta

C#中Hashtable、Dictionary详解以及写入和读取对比

2013年04月22日 11:03    供稿中心: 互联网运营部 摘要: 在本文中将从基础角度讲解HashTable.Dictionary的构造和通过程序进行插入读取对比. 在本文中将从基础角度讲解HashTable.Dictionary的构造和通过程序进行插入读取对比. 一:HashTable 1.HashTable是一种散列表,他内部维护很多对Key-Value键值对,其还有一个类似索引的值叫做散列值(HashCode),它是根据GetHashCode方法对Key通过一定算法获取得到的,所