重要前提:ASP.NET模仿Java的過程中拋棄了HashMap,所以C#.Net中沒有HashMap,只有HashTable。
|
|
Hashtable和Dictionary從資料結構上來說都屬於Hashtable(雜湊表),都是對關鍵字(鍵值)進行散列操作,將關鍵字散列到Hashtable的某一個槽位中去,不同的是處理碰撞的方法。 散列函數有可能將不同的關鍵字散列到Hashtable中的同一個槽中去,這個時候我們稱發生了碰撞,為了將資料插入進去,我們需要另外的方法來解決這個問題。 |
|
碰撞處理方法比較 |
|
Dictionary |
鏈表法 |
HashTable |
開放定址法(open addressing)-中雙重散列方法 |
使用時機比較 |
|
Dictionary |
資料修改動作很多時。 說明:因為解決碰撞的方式是List.Add |
HashTable |
資料查詢的動作很多時。 說明:因為映射查找之後,只需要跳躍查找到,碰撞後移動資料即可,另外當增加資料太多時,開放定址的擴充很耗費性能。 |
Dictionary & HashTable使用比較 |
|
1單執行緒程式中 |
推薦使用Dictionary,有泛型優勢,且讀取速度較快,容量利用更充分. |
2多執行緒程式中 |
多執行緒程式中推薦使用Hashtable,默認的Hashtable允許單執行緒寫入,多執行緒讀取,對Hashtable進一步調用Synchronized()方法可以獲得完全執行緒安全的類型。而Dictionary非執行緒安全,必須人為使用lock語句進行保護,效率大減。 |
|
|
|
|
|
也許很多人說,既然Dictionary如此強大,那麼我們為什麼不用Dictionary來代替一切集合呢? 在這裡我們除了剛才的遍歷問題,還要提到Dictionary的存儲空間問題,在Dictionary中,除了要存儲我們實際需要的Value外,還需要一個輔助變數Key,這就造成了記憶體空間的雙重浪費。 而且在尾部插入時,List只需要在其原有的位址基礎上向後延續存儲即可,而Dictionary卻需要經過複雜的Hash計算,這也是性能損耗的地方。 |
|
|
|
|
資料來源:https://blog.csdn.net/mengyue000/article/details/77601250