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", );
dic.Add("A", );
//Console.WriteLine(ht["A"]+1); //编译错误!Object类型不能和int类型直接进行相加。
Console.WriteLine((int)ht["A"] + );//编译通过,输出结果为:2
Console.WriteLine(dic["A"] + ); //编译通过,输出结果为:2
第二、读取数据的顺序与添加数据的顺序的一致性
Dictionary和Hashtable的读取数据的顺序和添加数据时的数据的顺序的一致性均不能够保证,或者可以说没有一致性。
Dictionary在只添加不删除的时候能够保持读取数据的顺序和添加时候的顺序是一致的;
但是经过删除和添加操作之后,就不能够保证读取数据的顺序和添加时候的顺序一致了。
Dictionary<int, int> dic = new Dictionary<int, int>();
dic.Add(, );
dic.Add(, );
dic.Add(, ); Console.WriteLine("仅仅经过添加元素处理之后:"); foreach (KeyValuePair<int, int> kvp in dic)
{
Console.WriteLine("Key:" + kvp.Key + " Value:" + kvp.Value);
} dic.Remove();
dic.Add(, ); 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的更多相关文章
- (转)C#中键值对类型Hashtable与Dictionary比较和相关用法
最近在使用C#中的Hashtable与Dictionary的时候,想知道其区别,通过查找网络相关博客资料,作出下列总结. Hashtable与Dictionary虽然都是作为键值对的载体,但是采用的是 ...
- C# 集合类 :(Array、 Arraylist、List、Hashtable、Dictionary、Stack、Queue)
我们用的比较多的非泛型集合类主要有 ArrayList类 和 HashTable类.我们经常用HashTable 来存储将要写入到数据库或者返回的信息,在这之间要不断的进行类型的转化,增加了系统装箱和 ...
- C#中字典集合HashTable、Dictionary、ConcurrentDictionary三者区别
C#中HashTable.Dictionary.ConcurrentDictionar三者都表示键/值对的集合,但是到底有什么区别,下面详细介绍 一.HashTable HashTable表示键/值对 ...
- Hashtable、Dictionary和List 谁效率更高
一 前言 很少接触HashTable晚上回来简单看了看,然后做一些增加和移除的操作,就想和List 与 Dictionary比较下存数据与取数据的差距,然后便有了如下的一此测试, 当然我测的方法可能不 ...
- C#中Hashtable、Dictionary详解以及写入和读取对比
转载:http://www.cnblogs.com/chengxingliang/archive/2013/04/15/3020428.html 在本文中将从基础角度讲解HashTable.Dicti ...
- 深入解析Hashtable、Dictionary、SortedDictionary、SortedList
我们先看Hashtable. MSDN的解释:表示键/值对的集合,这些键/值对根据键的哈希代码进行组织. Hash算法是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定 ...
- Hashtable与Dictionary比较
项目需要存储Tcp连接对象,考虑使用Hashtable或者Dictionary存储.Hashtable在查询方面有优势,Dictionary在确定类型下不需要拆箱与装箱有优势.于是,写了个demo对两 ...
- C# Hashtable vs Dictionary 学习笔记
Hashtable 和 Dictionary 存储的都是键值对,我的理解是Dictionary是Hashtable的泛型实现. Hashtable的键和值都是object类型.所以,key和value ...
- C#中的HashSet, HashTable, Dictionary的区别【转】
HashSet和Python中的Set差不多,都是为逻辑运算准备的,HashSet不允许数据有重复,且存入的时单值不是键值对. HashTable和Dictionary差不多,但是他们的实现方式时不同 ...
随机推荐
- window常见事件
<script type="text/javascript"> /*onunload = function(){ alert("onunload run&qu ...
- String与StringBuilder之间区别(转)
当我们在初学使用C#时,常常会不知道该用StringBuilder合适还是用String高效,下面是我在学习当中对StringBuilder和String的区别总结,分享给大家. String类有不可 ...
- javac编译、运行
java源码(包结构) 源码存放位置:C:/Users/liaolongjun/DeskTop/java/ package test; import test.sub.F; public class ...
- java线程生命周期及其对应方法
http://blog.sina.com.cn/s/blog_a8aa82cc0101ktrm.html http://wenku.baidu.com/view/c242df69011ca300a6c ...
- HTML DOM基础知识
HTML DOM基础知识 一.什么是DOM? 1.HTML DOM 定义了访问和操作HTML文档的标准方法. 2.HTML DOM 把 HTML 文档呈现为带有元素.属性和文本的树结构(节点树). 3 ...
- Maven-010-maven 编译报错:Failure to ... in ... was cached in the local repository, resolution will not be reattempted until the update interval of nexus has elapsed or updates are forced.
今晚在编译 maven 项目的时候,命令行报错,出现 Failure to ... in ... 类似错误,详细的错误信息如下所示: [INFO] -------------------------- ...
- ssm框架web.xml中filter配置问题
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://w ...
- ionic实现手机检测app是否安装,未安装则下载安装包,已安装则打开app(未实现iOS平台)
插件需求(上cordova官网下载): com.lampa.startapp cordova-plugin-appavailability cordova-plugin-inappbrowser 代码 ...
- Git add 常见用法
Git add git add [参数] [--] <路径> //作用就是将我们需要提交的代码从工作区添加到暂存区,就是告诉git系统,我们要提交哪些文件,之后就可以使用gi ...
- ERROR 1010 (HY000): Error dropping database (can't rmdir '.\qpweb', errno: 41) 删库失败问题的解决
Win8 下,MySQL5.5,root 用户登录 MySQL 5.5 Command Line Client,删除 qpweb 数据,执行命令 drop database qpweb;报错信息:ER ...