亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C# Hashtable/Dictionary寫入和讀取對比詳解

2020-01-24 03:04:22
字體:
來源:轉載
供稿:網友

一: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<string, object> _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<string, object>();
            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<_Hashtable.Count;i++)
            {
                si++;
            }
            stopWatch.Stop();
            Console.WriteLine(" HashTable遍歷時間:" + stopWatch.Elapsed + " ,遍歷采用for方式");

            //Dictionary插入dataCount條數據需要時間
            stopWatch.Reset();
            si = 0;
            stopWatch.Start();
            foreach (var s in _Hashtable)
            {
                si++;
            }
            stopWatch.Stop();
            Console.WriteLine(" HashTable遍歷時間:" + stopWatch.Elapsed + " ,遍歷采用foreach方式");

            //Dictionary插入dataCount條數據需要時間
            stopWatch.Reset();
            si = 0;
            stopWatch.Start();
            IDictionaryEnumerator _hashEnum = _Hashtable.GetEnumerator();
            while (_hashEnum.MoveNext())
            {
                si++;
            }
            stopWatch.Stop();
            Console.WriteLine(" HashTable遍歷時間:" + stopWatch.Elapsed + " ,遍歷采用HashTable.GetEnumerator()方式");

            //Dictionary插入dataCount條數據需要時間
            stopWatch.Reset();
            si = 0;
            stopWatch.Start();
            for(int i=0;i<_Dictionary.Count;i++)
            {
                si++;
            }
            stopWatch.Stop();
            Console.WriteLine(" Dictionary遍歷時間:" + stopWatch.Elapsed + " ,遍歷采用for方式");

            //Dictionary插入dataCount條數據需要時間
            stopWatch.Reset();
            si = 0;
            stopWatch.Start();
            foreach (var s in _Dictionary)
            {
                si++;
            }
            stopWatch.Stop();
            Console.WriteLine(" Dictionary遍歷時間:" + stopWatch.Elapsed + " ,遍歷采用foreach方式");

            //Dictionary插入dataCount條數據需要時間
            stopWatch.Reset();
            si = 0;
            stopWatch.Start();
            _hashEnum = _Dictionary.GetEnumerator();
            while (_hashEnum.MoveNext())
            {
                si++;
            }
            stopWatch.Stop();
            Console.WriteLine(" Dictionary遍歷時間:" + stopWatch.Elapsed + " ,遍歷采用Dictionary.GetEnumerator()方式");


            Console.WriteLine("/n-------------------------------------------------");
        }
    }




四:從上面的結果可以看出

1.HashTable大數據量插入數據時需要花費比Dictionary大的多的時間。
2.for方式遍歷HashTable和Dictionary速度最快。
3.在foreach方式遍歷時Dictionary遍歷速度更快。
五:在單線程的時候使用Dictionary更好一些,多線程的時候使用HashTable更好。
因為HashTable可以通過Hashtable tab = Hashtable.Synchronized(new Hashtable());獲得線程安全的對象。
當然因為各自電腦的情況不一樣,可能會有部分誤差。如有問題,敬請斧正。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲综合中文字幕68页| 亚洲精品日韩av| 国产精品91久久久久久| 久久精品国产一区| 中文字幕日韩高清| 欧美激情在线播放| 欧美日韩亚洲一区二| 色与欲影视天天看综合网| 亚洲电影免费观看高清完整版在线| 97在线观看视频| 精品中文字幕乱| 欧美一级在线亚洲天堂| 亚洲最大av网站| 欧美成人精品在线| 国产精品久久久久久久7电影| 亚洲香蕉成视频在线观看| 2019中文字幕全在线观看| 欧美丝袜一区二区三区| 精品久久久一区二区| 色噜噜国产精品视频一区二区| 日韩精品中文字幕在线| 亚洲免费av网址| 日韩在线欧美在线| 日韩国产欧美区| 欧美国产日韩一区二区在线观看| 亚洲欧美中文日韩在线v日本| 国产成人综合一区二区三区| 精品福利在线视频| 日韩欧美精品在线观看| 久久6精品影院| 亚洲有声小说3d| 97国产在线观看| 欧美大片网站在线观看| 亚洲一区二区三区四区在线播放| 国产精品极品美女粉嫩高清在线| 欧美成aaa人片在线观看蜜臀| 欧美福利视频网站| 欧美性xxxx在线播放| 国产精品影院在线观看| 色偷偷91综合久久噜噜| 中文字幕av一区| 亚洲欧美在线磁力| 中文字幕精品视频| 欧美美最猛性xxxxxx| wwwwwwww亚洲| 青青久久aⅴ北条麻妃| 成人黄色中文字幕| 日韩精品中文字幕在线观看| 亚洲精品综合久久中文字幕| 夜色77av精品影院| 亚洲综合中文字幕在线| 久久综合国产精品台湾中文娱乐网| 日韩av在线不卡| 久久人人爽亚洲精品天堂| 欧美激情第1页| 俺也去精品视频在线观看| 美女性感视频久久久| 91av在线免费观看| 亚洲激情视频网站| 亚洲人高潮女人毛茸茸| 欧美精品久久久久| 成人疯狂猛交xxx| 精品视频一区在线视频| 精品国产区一区二区三区在线观看| 日韩免费不卡av| 国产精品视频区| 久久视频免费观看| 欧美大片免费观看| 亚洲天堂av在线免费| 成人美女免费网站视频| 欧美视频中文字幕在线| 国产亚洲精品久久久久久牛牛| 6080yy精品一区二区三区| 亚洲天堂一区二区三区| 2018中文字幕一区二区三区| 成人福利网站在线观看11| 九九九热精品免费视频观看网站| 成人免费福利在线| 国产欧美日韩免费| 亚洲一区二区三区xxx视频| 欧美激情一区二区久久久| 国产日韩换脸av一区在线观看| 日韩欧美aⅴ综合网站发布| 亚洲精品日韩激情在线电影| 亚洲欧美国产精品va在线观看| 亚洲欧美激情精品一区二区| 国产精品久久久久不卡| 精品国产乱码久久久久久天美| 日韩福利在线播放| 欧美大片va欧美在线播放| 亚洲精品自拍视频| 日韩欧美中文免费| 青青久久aⅴ北条麻妃| 97色在线观看免费视频| 日本最新高清不卡中文字幕| 91免费欧美精品| 黄网站色欧美视频| 91精品国产综合久久男男| 亚洲电影天堂av| 精品激情国产视频| 国产精品高潮呻吟视频| 国产精品 欧美在线| 亚洲欧美一区二区三区在线| 亚洲国产另类久久精品| 色综合五月天导航| 神马久久久久久| 亚洲欧洲自拍偷拍| 国产中文字幕91| 亚洲字幕一区二区| 国产精品中文在线| 一道本无吗dⅴd在线播放一区| 欧美精品在线视频观看| 国产在线精品一区免费香蕉| 国产精品女主播视频| 另类图片亚洲另类| 国产午夜精品麻豆| 一区二区三区回区在观看免费视频| 日韩中文字幕不卡视频| 国产成人精品av在线| 日韩欧美大尺度| 国产欧美日韩最新| 国产剧情日韩欧美| 国产精品999999| 欧美大片大片在线播放| 成人免费xxxxx在线观看| 91大神福利视频在线| 国内自拍欧美激情| 日本精品久久中文字幕佐佐木| 欧美精品18videos性欧美| 国产噜噜噜噜久久久久久久久| 欧美高跟鞋交xxxxxhd| 亚洲国产精品成人精品| 欧美日本啪啪无遮挡网站| 欧美人成在线视频| 亚洲欧美第一页| 亚洲国产日韩精品在线| 久久精视频免费在线久久完整在线看| 色综合老司机第九色激情| 91在线视频一区| 97久久久久久| 久久综合色88| 国产精品一区二区三区免费视频| 一区二区欧美日韩视频| 福利二区91精品bt7086| 奇米4444一区二区三区| 久久久久久97| …久久精品99久久香蕉国产| 国产精品自产拍在线观| 欧美日韩中文字幕在线视频| 亚洲欧美精品伊人久久| 欧美电影在线免费观看网站| 欧美激情手机在线视频| 国产精品久久久精品| 精品久久久久久电影| 久久高清视频免费| 欧美日韩亚洲视频一区| 日韩最新在线视频| 欧美午夜女人视频在线| 欧美片一区二区三区| 在线观看欧美视频| 亚洲一区二区三区视频播放| 欧美国产中文字幕| 久久影院中文字幕| xvideos亚洲人网站|