.Net 中HashTable,HashMap 和 Dictionarykey,value 和ListT和DataTable的比较
轉載自http://www.cnblogs.com/jilodream/p/4219840.html
(一)HashTable??? 和Dic?
?
數據結構
Hashtable和Dictionary從數據結構上來說都屬于Hashtable(哈希表),都是對關鍵字(鍵值)進行散列操作,將關鍵字散列到Hashtable的某一個槽位中去,不同的是處理碰撞的方法。散列函數有可能將不同的關鍵字散列到Hashtable中的同一個槽中去,這個時候我們稱發生了碰撞,為了將數據插入進去,我們需要另外的方法來解決這個問題。
采用鏈表法的是Dic??? 而采用開放尋址法(open addressing)-中? 雙重散列的方法的是 HashTable
至于這兩種數據結構的使用方法??請自行閱讀算法導論?? 或者參照網上博客
但從底層的數據結構可以發現
如果增刪的動作很多的話 推薦使用Dic? 因為解決碰撞的方式? 是List.Add
如果改動的動作很少? 查詢的動作很多的話?? 則推薦?使用HashTable? 因為映射查找之后? 只需要跳躍查找到? 碰撞后移動數據即可,另外當增加數據太多時,開放尋址的擴容很耗費性能(請閱讀<算法導論>)
Dic 和HashTable使用比較
1:單線程程序中推薦使用 Dictionary, 有泛型優勢, 且讀取速度較快, 容量利用更充分.
?2:多線程程序中推薦使用 Hashtable, 默認的 Hashtable 允許單線程寫入, 多線程讀取, 對 Hashtable 進一步調用 ?Synchronized() 方法可以獲得完全線程安全的類型. 而 Dictionary 非線程安全, 必須人為使用 lock 語句進行保護, ?效率大減.
?3:Dictionary 有按插入順序排列數據的特性 (注: 但當調用 Remove() 刪除過節點后順序被打亂), 因此在需要體現順序的情境中使用 Dictionary 能獲得一定方便.?//Dic遍歷時? 會采用插入時的遍歷,而hashTable 采用遍歷時 則是打亂的
Hashtable 類和 Dictionary<TKey, TValue> 泛型類實現 IDictionary 接口
Dictionary<TKey, TValue> 泛型類還實現 IDictionary<TKey, TValue>泛型接口。
因此,這些集合中的每個元素都是一個鍵/值對。
Dictionary<TKey, TValue> 類與 Hashtable 類的功能相同
對于值類型,特定類型(不包括 Object)的 Dictionary<TKey, TValue> 的性能優于 Hashtable,這是因為 Hashtable 的元素屬于 Object ?類型,所以在存儲或檢索值類型時通常發生裝箱和取消裝箱操作。
?
(二)Dic? 和 List<T>
關于數據結構:
在前邊的比較已經介紹了Dic?? 那么 List?<T> 的數據結構是什么樣子的:
List<T>是 ArrayList 的泛型等效類(繼承了泛型接口)
堆中的樣子是這樣的
?
?
我們為了討論遍歷時Dictionary和List的效率,有個高人寫了個代碼,這是載圖
?
很明顯,LIST效率要好的多。
問題剖析
同樣是集合,為什么性能會有這樣的差距。我們要從存儲結構和操作系統的原理談起。
首先我們清楚List<T>是對數組做了一層包裝,我們在數據結構上稱之為線性表,而線性表的概念是,在內存中的連續區域,除了首節點和尾節點外,每個節點都有著其唯一的前驅結點和后續節點。我們在這里關注的是連續這個概念。
而HashTable或者Dictionary,他是根據Key而根據Hash算法分析產生的內存地址,因此在宏觀上是不連續的,雖然微軟對其算法也進行了很大的優化。
由于這樣的不連續,在遍歷時,Dictionary必然會產生大量的內存換頁操作,而List只需要進行最少的內存換頁即可,這就是List和Dictionary在遍歷時效率差異的根本原因。
所以根據value 的查找? dic 的效率是高于 List 的 但是遍歷的話?? 則Dic 要差點。這就好比你要摘抄書里邊的所有文字? 是根據目錄 查一個找一篇文章?快,還是直接從正文開始 從頭到尾快遍歷快一樣。單獨的找某一篇知道題目(key)的文章 當然是從目錄快了
再談Dictionary
也許很多人說,既然Dictionary如此強大,那么我們為什么不用Dictionary來代替一切集合呢?
在這里我們除了剛才的遍歷問題,還要提到Dictionary的存儲空間問題,在Dictionary中,除了要存儲我們實際需要的Value外,還需要一個輔助變量Key,這就造成了內存空間的雙重浪費。
而且在尾部插入時,List只需要在其原有的地址基礎上向后延續存儲即可,而Dictionary卻需要經過復雜的Hash計算,這也是性能損耗的地方。
?
(三)List<T>和 DataTable
DataTable,IList性能比較
1)二進制序列化的情況
從測試結果可以看出,IList<T>序列化的文件大小比DataTable小得多,這意味著在數據傳輸中帶寬占用小很多,所以在設計Remoting接口時盡量使用IList<T>作返回值。
2)XML序列化的情況
從測試結果可以看出,IList<T>序列化后的文件比同樣比DataTable小,但差距已經沒有二進制序列化那么明顯了。而且IList<T>的二進制序列化和XML序列化相差很大,所以remoteing中建議使用二進制序列化。
3)操作性比較
DataTable有支持數據的提交、回滾、查詢等強大的方法,但訪問單元格內容的時候不方便,還要類型轉換。
IList<T>則訪問項的屬性比較方便,有屬性自動提示,不用類型轉換,有LINQ的協助也能實現強大的查詢。
轉載于:https://www.cnblogs.com/johnblogs/p/6704893.html
總結
以上是生活随笔為你收集整理的.Net 中HashTable,HashMap 和 Dictionarykey,value 和ListT和DataTable的比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二、python基础(列表、元组、字符串
- 下一篇: 脱水缩合