当前位置:  编程技术>.net/c#/asp.net

C# Hashtable/Dictionary写入和读取对比详解

    来源: 互联网  发布时间:2014-10-24

    本文导语:  一:HashTable1.HashTable是一种散列表,他内部维护很多对Key-Value键值对,其还有一个类似索引的值叫做散列值(HashCode),它是根据GetHashCode方法对Key通过一定算法获取得到的,所有的查找操作定位操作都是基于散列值来实现找到对...

一:HashTable
1.HashTable是一种散列表,他内部维护很多对Key-Value键值对,其还有一个类似索引的值叫做散列值(HashCode),它是根据GetHashCode方法对Key通过一定算法获取得到的,所有的查找操作定位操作都是基于散列值来实现找到对应的Key和Value值的。
2.我们需要使用一个算法让散列值对应HashTable的空间地址尽量不重复,这就是散列函数(GetHashCode)需要做的事。
3.当一个HashTable被占用一大半的时候我们通过计算散列值取得的地址值可能会重复指向同一地址,这就是哈希冲突。
在.Net中键值对在HashTable中的位置Position= (HashCode& 0x7FFFFFFF) % HashTable.Length,.net中是通过探测法解决哈希冲突的,当通过散列值取得的位置Postion以及被占用的时候,就会增加一个位移x值判断下一个位置Postion+x是否被占用,如果仍然被占用就继续往下位移x判断Position+2*x位置是否被占用,如果没有被占用则将值放入其中。当HashTable中的可用空间越来越小时,则获取得到可用空间的难度越来越大,消耗的时间就越多。
4.当前HashTable中的被占用空间达到一个百分比的时候就将该空间自动扩容,在.net中这个百分比是72%,也叫.net中HashTable的填充因子为0.72。例如有一个HashTable的空间大小是100,当它需要添加第73个值的时候将会扩容此HashTable.
5.这个自动扩容的大小是多少呢?答案是当前空间大小的两倍最接近的素数,例如当前HashTable所占空间为素数71,如果扩容,则扩容大小为素数131.

二:Dictionary

1.Dictionary是一种变种的HashTable,它采用一种分离链接散列表的数据结构来解决哈希冲突的问题。
2.分离链接散列表是当散列到同一个地址的值存为一个链表中。
3.这个变种HashTable的填充因子是1

三:本文将以代码的形式探索HashTable和Dictionary的插入和三种读取方式的效率(for/foreach/GetEnumerator)

代码如下:

public class HashTableTest
    {
        static Hashtable _Hashtable;
        static Dictionary _Dictionary;
        static void Main()
        {
            Compare(10);
            Compare(10000);
            Compare(5000000);
            Console.ReadLine();
        }
        public static void Compare(int dataCount)
        {
            Console.WriteLine("-------------------------------------------------n");
            _Hashtable = new Hashtable();
            _Dictionary = new Dictionary();
            Stopwatch stopWatch = new Stopwatch();
            //HashTable插入dataCount条数据需要时间
            stopWatch.Start();
            for (int i = 0; i < dataCount; i++)
            {
                _Hashtable.Add("Str" + i.ToString(), "Value");
            }
            stopWatch.Stop();
            Console.WriteLine(" HashTable插入" + dataCount + "条数据需要时间:" + stopWatch.Elapsed);

            //Dictionary插入dataCount条数据需要时间
            stopWatch.Reset();
            stopWatch.Start();
            for (int i = 0; i < dataCount; i++)
            {
                _Dictionary.Add("Str" + i.ToString(), "Value");
            }
            stopWatch.Stop();
            Console.WriteLine(" Dictionary插入" + dataCount + "条数据需要时间:" + stopWatch.Elapsed);

            //Dictionary插入dataCount条数据需要时间
            stopWatch.Reset();
            int si = 0;
            stopWatch.Start();
            for(int i=0;i


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.util类hashtable<k,v>的类成员方法: hashtable定义及介绍
  • Hashtable问题,方法中返回的Hashtable的capacity发生变化
  • java命名空间java.util类hashtable<k,v>的类成员方法: clear定义及介绍
  • Hashtable
  • java命名空间java.util类hashtable<k,v>的类成员方法: rehash定义及介绍
  • 遍历Hashtable 的几种方法
  • java命名空间java.util类hashtable<k,v>的类成员方法: tostring定义及介绍
  • 请问怎样遍历一个hashtable
  • java命名空间java.util类hashtable<k,v>的类成员方法: clone定义及介绍
  • about Hashtable
  • java命名空间java.util类hashtable<k,v>的类成员方法: keys定义及介绍
  • Hashtable的用法
  • java命名空间java.util类hashtable<k,v>的类成员方法: isempty定义及介绍
  • hashcode()和hashtable()方法是作什吗用的?(就剩3分了)
  • java命名空间java.util类hashtable<k,v>的类成员方法: elements定义及介绍
  • 请教:请问java中存放数据库中的记录,用什么数据结构?(hashtable?vector?还是别的?)
  • java命名空间java.util类hashtable<k,v>的类成员方法: containsvalue定义及介绍
  • 在线等待:如何将long型数据转化为String型?或者如何将两个long型数据put进HashTable中?
  • java命名空间java.util类hashtable<k,v>的类成员方法: hashcode定义及介绍
  • JAVA里哪一个数据结构库(hashtable,vector等)支持一对多的关系?
  • java命名空间java.util类hashtable<k,v>的类成员方法: putall定义及介绍
  • 请问自己定义的对象如何使用Hashtable存取?




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3