Hashtable,ListDictionary,HybridDictionary 的使用

原创 2007年09月14日 11:28:00
以下是 拷贝的文章
Hashtable,ListDictionary,HybridDictionary

1.所谓存储名值对的三个容器: key-value

2.性能上
小数据量: ListDictionary优于Hashtable
大数据量: Hashtable优于ListDictionary
要知道Hashtable并不是线性存储结构,但是对于利用Hash因子取值的Hashtable在处理大数据量的时候有优势.

3.那么什么是小,什么是大?
10个或10个以下为小,10个以上为大.
如果你知道你的容器将存储的数据量肯定不超过10的话,请你选用ListDictionary
否则,请你选用Hashtable.

4.为什么要用HybridDictionary?
因为你往往不知道什么情况下,他的数据量将是多少.
如果你知道,那么请看3.
如果你不知道,请使用HybridDictionary,因为它帮你智能化的决定你的数据该用ListDictionary存储还是Hashtable存储.
而不用你主动决定该用那个数据类型.


因此,大家可以多多使用HybridDictionary,而不用直接使用Hashtable,因为我们的Hashtable存储的值往往并没有 那么多.
以上三个,都属hashtable,那Dictionary与他们有什么不同呢?
由于 Hashtable 和 Dictionary 同时存在, 在使用场景上必然存在选择性, 并不任何时刻都能相互替代.
    [1] 单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.
    [2] 多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减.
    [3] Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便.     以上分别谈到了  Hashtable, HashMap 和 Dictionary 三种类型, 介绍告一段落, 下面增加一些不成熟的观点:     [1] 三种哈希表均允许任意 object 做关键字, 但实际使用中我们一般只用 string 做键值, 对 string 做 HashOf(string) 处理比较单纯, 速度较快, 而对 object 取 HashOf(object) 则情况复杂. 若想进一步提高速度, 可以考虑自定义一个只允许 string 作为关键字的哈希表.     [2] Java HashMap 由于 f(K) 取与运算的特性, 每次扩容必须是 2 倍, 没有价钱可讲. 但 .NET Hashtable 和  Dictionary 的容量理论上只要求是质数, 新容量不一定要达到旧容量的 2 倍以上, 因而想进一步提高内存利用率, 可以考虑重写 Resize() 方法, 使得每次扩容变成稍大一点的质数即可. 当然这样一来插入效率会降低, 自行取舍.     [3] 对 Hashtable  初始化时直接指定 capacity 是个好主意, 减少了 Resize() 的次数, 降低开销.   由于 Hashtable 和 Dictionary 同时存在, 在使用场景上必然存在选择性, 并不任何时刻都能相互替代.
    [1] 单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.
    [2] 多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减.
    [3] Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便.     以上分别谈到了  Hashtable, HashMap 和 Dictionary 三种类型, 介绍告一段落, 下面增加一些不成熟的观点:     [1] 三种哈希表均允许任意 object 做关键字, 但实际使用中我们一般只用 string 做键值, 对 string 做 HashOf(string) 处理比较单纯, 速度较快, 而对 object 取 HashOf(object) 则情况复杂. 若想进一步提高速度, 可以考虑自定义一个只允许 string 作为关键字的哈希表.     [2] Java HashMap 由于 f(K) 取与运算的特性, 每次扩容必须是 2 倍, 没有价钱可讲. 但 .NET Hashtable 和  Dictionary 的容量理论上只要求是质数, 新容量不一定要达到旧容量的 2 倍以上, 因而想进一步提高内存利用率, 可以考虑重写 Resize() 方法, 使得每次扩容变成稍大一点的质数即可. 当然这样一来插入效率会降低, 自行取舍.     [3] 对 Hashtable  初始化时直接指定 capacity 是个好主意, 减少了 Resize() 的次数, 降低开销.  
更多的集合介绍:
 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

hashtable的使用

  • 2012-02-29 10:20
  • 195KB
  • 下载

Hashtable的使用

  • 2008-05-26 17:06
  • 43KB
  • 下载

.net集合类的研究--链表—ListDictionary,LinkedList<T>

链表是数据结构中存储数据的一种形式,我们经常使用的List,ArrayList,Hashtable等容器类,存取操作时是用数组Array来保存,ListDictionary和LinkedList不用A...

.net集合类的研究--链表—ListDictionary,LinkedList<T>

链表是数据结构中存储数据的一种形式,我们经常使用的List,ArrayList,Hashtable等容器类,存取操作时是用数组Array来保存,ListDictionary和LinkedList不用A...

Hashtable的子类Properties的使用

Properties类是Hashtable的子类: Properties类是一个属性集,它的主要作用就是读写资源配置文件,该类中的键与值都要求是字符串 资源配置文件的好处就是可以动态的切换不同数据...

C#有关HashTable的具体使用用法详解

C#中如何操作HashTable类呢?本文将给你答案,哈希表(Hashtable)简述在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,...

java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别

java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别、 经常会看到程序中使用了记录集,常用...

Java集合:Hashtable使用详解及源码分析

1 使用方法  Hashtable是和HashMap类似的散列表,存储的内容为key-value键值对,key的值是唯一的,和HashMap不同的是key和value都不能为null。Hashtabl...

HashTable和泛型Dictionary的使用

下面是简单的例子,包括声明,填充键值对,移除键值对,遍历键值对             Dictionary myDic = new Dictionary();  &...

如何使用php的hashtable

hash表(散列表)在我看来一直是个牛逼的设计,因为它时间复杂度为O(1)。简直是远离循环,减少耗时的神器。今天好好看了看hash表的实现原理,觉得其实是自己把大学期间的基础知识给忘得一干二净,不扯远...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)