31、C#:键值对类型Hashtable与Dictionary比较和相关用法
2017-08-13 16:52
671 查看
本文来自:http://www.2cto.com/kf/201304/201715.html
最近在使用C#中的Hashtable与Dictionary的时候,想知道其区别,通过查找网络相关博客资料,作出下列总结。
Hashtable与Dictionary虽然都是作为键值对的载体,但是采用的是不同的数据结构。就像Java中的ArrayList与LinkList,虽然都是实现了List接口作为集合载体,但是其内部结构是不一样的,ArrayList是通过数组实现的,LinkList是通过对象链表实现的。
由于 Hashtable 和 Dictionary 同时存在, 在使用场景上必然存在选择性, 并不任何时刻都能相互替代.
[1] 单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.
[2] 多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减.
[3] Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便.
个人偏向于使用Dictionary,因为其使用泛型,可控性比较强。在一些资料中,很多人也推荐使用Dictionary,其原因主要有
1、Dic是类型安全的,这有助于我们写出更健壮更具可读性的代码,而且省却我们强制转化的麻烦。
2、Dic是泛行的,当K或V是值类型时,其速度远远超过Hashtable。处理对象时不需要进行显式或是隐式转型,进行值类型处理时不需要装箱。所以使用方便一些,而且效率会高一些(编码效率、运行效率),还不太容易出错。
Dictionary 调用 Add 方法之前使用 ContainsKey 方法测试某个键是否存在,否则得到一个KeyNotFoundException。当程序频繁尝试字典中不存在的键时,使用 TryGetValue 方法来检索值,这种方法是一种更有效的检索值的方法。
下面是对于Dictionary的一些常用的操作,包括遍历,添加,删除等
[csharp]
Dictionary<int, string> dictionary = new Dictionary<int, string>();
dictionary.Add(1, "xiaowang");
dictionary.Add(21, "dsd");
dictionary.Add(33, "dsfdfd");
dictionary.Add(4, "liusang");
foreach (KeyValuePair<int, string> kvp in dictionary)
{
Console.WriteLine("key={0},value={1}", kvp.Key, kvp.Value);
}
foreach (int j in dictionary.Keys)
{
Console.WriteLine("key={0},value={1}", j, dictionary[j]);
}
if (dictionary.ContainsKey(2))
{
Console.WriteLine(dict[2]);
}
//遍历Keys
foreach (var item in dictionary.Keys)
{
Console.WriteLine("Key:{0}", item);
}
//遍历Values
foreach (var item in dictionary.Values)
{
Console.WriteLine("value:{0}", item);
}
<BR>
最近在使用C#中的Hashtable与Dictionary的时候,想知道其区别,通过查找网络相关博客资料,作出下列总结。
Hashtable与Dictionary虽然都是作为键值对的载体,但是采用的是不同的数据结构。就像Java中的ArrayList与LinkList,虽然都是实现了List接口作为集合载体,但是其内部结构是不一样的,ArrayList是通过数组实现的,LinkList是通过对象链表实现的。
由于 Hashtable 和 Dictionary 同时存在, 在使用场景上必然存在选择性, 并不任何时刻都能相互替代.
[1] 单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.
[2] 多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减.
[3] Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便.
个人偏向于使用Dictionary,因为其使用泛型,可控性比较强。在一些资料中,很多人也推荐使用Dictionary,其原因主要有
1、Dic是类型安全的,这有助于我们写出更健壮更具可读性的代码,而且省却我们强制转化的麻烦。
2、Dic是泛行的,当K或V是值类型时,其速度远远超过Hashtable。处理对象时不需要进行显式或是隐式转型,进行值类型处理时不需要装箱。所以使用方便一些,而且效率会高一些(编码效率、运行效率),还不太容易出错。
Dictionary 调用 Add 方法之前使用 ContainsKey 方法测试某个键是否存在,否则得到一个KeyNotFoundException。当程序频繁尝试字典中不存在的键时,使用 TryGetValue 方法来检索值,这种方法是一种更有效的检索值的方法。
下面是对于Dictionary的一些常用的操作,包括遍历,添加,删除等
[csharp]
Dictionary<int, string> dictionary = new Dictionary<int, string>();
dictionary.Add(1, "xiaowang");
dictionary.Add(21, "dsd");
dictionary.Add(33, "dsfdfd");
dictionary.Add(4, "liusang");
foreach (KeyValuePair<int, string> kvp in dictionary)
{
Console.WriteLine("key={0},value={1}", kvp.Key, kvp.Value);
}
foreach (int j in dictionary.Keys)
{
Console.WriteLine("key={0},value={1}", j, dictionary[j]);
}
if (dictionary.ContainsKey(2))
{
Console.WriteLine(dict[2]);
}
//遍历Keys
foreach (var item in dictionary.Keys)
{
Console.WriteLine("Key:{0}", item);
}
//遍历Values
foreach (var item in dictionary.Values)
{
Console.WriteLine("value:{0}", item);
}
<BR>
相关文章推荐
- (转)C#中键值对类型Hashtable与Dictionary比较和相关用法
- C#中键值对类型Hashtable与Dictionary比较和相关用法
- C#中键值对类型Hashtable与Dictionary比较和相关用法
- C#中哈希表(HashTable)的用法详解以及和Dictionary比较
- C#.NET集合类型Hashtable与Dictionary 的区别
- C# 哈希表Hashtable与字典表Dictionary<K,V>的比较。
- 学习笔记(一)C#基础和泛型List和DataTable和HashTable和Dictionary的简单用法--存值 取值
- C#中Dictionary,Hashtable,List的比较及分析
- [叩响C#之门] 22.7 Hashtable类( 散列表的基本原理和用法,比较得意的一篇,还请批评)
- (转载)C# 的Hashtable和Dictionary比较
- C# String Tips (C#String 类型的相关用法 收集)
- VB.NET 利用Hashtable.Dictionary等键值对类型来实现按添加顺序读取。
- 关于C++和C#类型比较的相关内容
- C# 的Hashtable和Dictionary比较
- C# 集合类 Array,Arraylist,List,Hashtable,Dictionary等比较
- C#学习笔记集合类型之Hashtable、Dictionary和SortedList(2)
- C# 的Hashtable和Dictionary比较
- C# 集合类 :(Array、 Arraylist、List、Hashtable、Dictionary、Stack、Queue)
- C#中Dictionary的用法
- C# 集合类 :(Array、 Arraylist、List、Hashtable、Dictionary、Stack、Queue)