C#Hashtable與Dictionary效能
由於 Hashtable 和 Dictionary 同時存在, 在使用場景上必然存在選擇性, 並不任何時刻都能相互替代.
[1] 單執行緒程式中推薦使用 Dictionary, 有泛型優勢, 且讀取速度較快, 容量利用更充分.
[2] 多執行緒程式中推薦使用 Hashtable, 預設的 Hashtable 允許單執行緒寫入, 多執行緒讀取, 對 Hashtable 進一步呼叫 Synchronized() 方法可以獲得完全執行緒安全的型別. 而 Dictionary 非執行緒安全, 必須人為使用 lock 語句進行保護, 效率大減.
[3] Dictionary 有按插入順序排列資料的特性 (注: 但當呼叫 Remove() 刪除過節點後順序被打亂), 因此在需要體現順序的情境中使用 Dictionary 能獲得一定方便.
幾種C#框架提供的資料結構對單值查詢的效率比較->http://www.cnblogs.com/eaglet/archive/2008/10/23/1317893.html
我個人是覺得,無論什麼時候,都應該使用Dictionary<K,V>,理由如下:
1、Dic是型別安全的,這有助於我們寫出更健壯更具可讀性的程式碼,而且省卻我們強制轉化的麻煩。這個相信大家都明白。
2、Dic是泛行的,當K或V是值型別時,其速度遠遠超過Hashtable。這個大家對值型別與引用型別有所瞭解的話也會明白。
3、如果K和V都是引用型別,如eaglet所測,Hashtable比Dic更快,這裡我要指出,eaglet所做的測試是有問題的。原因在於Hashtable與Dic採用的是不同的資料結構。eaglet的“Dictionary 由於在Hashtable基礎上封裝了一層”這個說法是不對的。
Dictionary 呼叫 Add 方法之前使用 ContainsKey 方法測試某個鍵是否存在,否則得到一個KeyNotFoundException。
當程式頻繁嘗試字典中不存在的鍵時,使用 TryGetValue 方法來檢索值,這種方法是一種更有效的檢索值的方法。
具體我也不講了,因為有人(Angel Lucifer)已經講得很清楚了,引用如下:
Hashtable在指定capacity引數時,它並不只開出capacity個槽的記憶體空間,而是開出比 capacity / 0.72(預設裝填因子) 大的最小素數個槽的空間;而Dic在指定capacity時,是開出 比capacity 大的最小素數個槽的空間。因此可以看到,樓主雖然都指定capacity為10萬,而實際上Hashtable的槽的總數遠遠大於Dic的槽的總數,也就是佔用的記憶體遠遠大於Dic,因此,如此測試是不公平不公正的,如要公平公正的測試,則應該把Dic的capacity指定為 10萬/0.72,請大家再測試其效能。
相關推薦
C#Hashtable與Dictionary效能
由於 Hashtable 和 Dictionary 同時存在, 在使用場景上必然存在選擇性, 並不任何時刻都能相互替代. [1] 單執行緒程式中推薦使用 Dictionary, 有泛型優勢, 且讀取速度較快, 容量利用更充分. [2] 多執行緒程式中推薦使用 Hash
C# HashTable與Dictionary的區別
字符串 同時 找到 lis mov ble logs 去除 lba HashTable和Dictionary的區別 1.HashTable 哈希表(HashTable)表示鍵/值對的集合。在.NET Framework中,Hashtable是System.Coll
C# Hashtable vs Dictionary 學習筆記
new 拆箱 打印 筆記 兩個 args for com 比較 Hashtable 和 Dictionary 存儲的都是鍵值對,我的理解是Dictionary是Hashtable的泛型實現。 Hashtable的鍵和值都是object類型。所以,key和v
C# HashTable和Dictionary
stat spa 可用 each before exception ash 運行 msdn 1.HashTable 哈希表(HashTable)表示鍵/值對的集合。 其中key通常可用來快速查找(key區分大小寫),value用於存儲對應於key的值。 默認的 Hasht
HashTable與Dictionary比較
看了好多這兩個類的總結,不同的人理解有些偏差,總結如下: 首先,兩者都用來儲存鍵值對。對於二者的區別,最明顯的就是Dictionary針對的是泛型,而HashTable是非泛型,鍵值對均為object型別,類似於list與arraylist的關
C#下Hashtable和Dictionary之間的差別
Hashtable和Dictionary都是.Net下的表示鍵值對的集合,那麼我們在使用中該選擇Hashtable還是Dictionary?下邊我們看看他們之間的區別:1、Dictionary<K,V>在使用中是順序儲存的,而Hashtable由於使用的是雜湊演算法進行資料儲存,是無序的。2、Di
C#中的HashSet, HashTable, Dictionary的區別
HashSet和Python中的Set差不多,都是為邏輯運算準備的,HashSet不允許資料有重複,且存入的時單值不是鍵值對。 HashTable和Dictionary差不多,但是他們的實現方式時不同的,Dictionary俗稱字典,裡面存放的時鍵值對,即Ke
[C#基礎教程]C# 泛型Dictionary 之一(Hashtable)使用說明
using System; using System.Collections.Generic; public class Example { public static void Main() { //建立泛型雜湊表,然後加入元素 Dictionary<s
C# 的Hashtable和Dictionary比較
我個人是覺得,無論什麼時候,都應該使用Dictionary<K,V>,理由如下: 1、Dic是型別安全的,這有助於我們寫出更健壯更具可讀性的程式碼,而且省卻我們強制轉化的麻煩。這個相信大家都明白。 2、Dic是泛型的,當K或V是值型別時,其速度遠遠超過Hashtable。這個大
排序演算法的C++實現與效能分析(插入排序、歸併排序、快速排序、STOOGE排序、堆排序)
選擇排序、快速排序、希爾排序、堆排序不是穩定的排序演算法 氣泡排序、插入排序、歸併排序和基數排序都是穩定的排序演算法。 總結: (1)如果資料量非常小,那麼適合用簡單的排序演算法:氣泡排序,選擇排序和插入排序。因為他們雖然比較次數多,但是移動次數少。比如,如果記錄的關鍵
學習筆記(一)C#基礎和泛型List和DataTable和HashTable和Dictionary的簡單用法--存值 取值
<pre name="code" class="csharp">//Dictionary Dictionary<string, string> dic = new Dictio
C# ref與out關鍵字解析
參數 logs linq using 如果 .cn cat oid 技術分享 簡介:ref和out是C#開發中經常使用的關鍵字,所以作為一個.NET開發,必須知道如何使用這兩個關鍵字. 1、相同點 ref和out都是按地址傳遞,使用後都將改變原來參數的數值。 2、ref
C# Stream 與 byte[]、文件的轉換
stream/* - - - - - - - - - - - - - - - - - - - - - - - - * Stream 和 byte[] 之間的轉換 * - - - - - - - - - - - - - - - - - - - - - - - */ /// <summary> ///
c++--模板與泛型編程
編譯 string std size_t har rom 數組大小 傳遞 成員函數 一、定義模板 1.1 函數模板 1. 適用情況:如果兩個函數幾乎是相同的,唯一的差異是參數的類型,函數體則完全一樣。 2. 定義 template <模板參數列表(以逗號分隔)&g
C# Hashtable賦值給另一個Hashtable時
元素 全部 nbsp htable table賦值 tab tor 操作 enume c#中想將一個hashtable的元素全部給另一個hashbale時, 使用叠代一個一個元素賦值 如: ammus.Clear(); IDictionaryEnume
c# backgroundworker 與invoke
src keras dev tool tools lis sla ogre += 1.BackgroundWorker b = new BackgroundWorker(); b.WorkerReportsProgres
C++繼承與派生
規則 方法 三種 賦值兼容 順序 spa 構造 指針 rtu 2017-06-25 23:00:59 c++中的繼承和派生是面向對象編程中的一個重要內容,通過繼承可以實現代碼的復用,同時繼承也是實現多態性的基礎。 一、c++繼承的基本形式 class 派生類名:繼承方式 基
C++編譯器與鏈接器工作原理
方式 成了 ble pro 需要 symbols ron oid 名稱 http://blog.csdn.net/success041000/article/details/6714195 1. 幾個概念 1)編譯:把源文件中的源代碼翻譯成機器語言,保存到目
C#堆與棧
完成 time bool 語言 收集器 一段 兩個 介紹 在一起 解釋1、棧是編譯期間就分配好的內存空間,因此你的代碼中必須就棧的大小有明確的定義;堆是程序運行期間動態分配的內存空間,你可以根據程序的運行情況確定要分配的堆內存的大小 解釋2、 存放在棧中時要管存儲順序,
C# 圖片與Base64互轉
name oba mar base64 richtext sender bin binary ram /// <summary> /// 將圖片數據轉換為Base64字符串 /// </summary> /// <pa