C# 之 Hashtable 與 Dictionary
Dictionary<TKey, TValue> () Hashtable()
第一、儲存的資料型別
Hashtable不是泛型的,不是型別安全的;Dictionary是泛型的,是型別安全的;
Hashtable的鍵值都是Object型別的,但是Dictionary的鍵值的資料型別是可以指定的。
也就是說如果往Hashtable裡面存入Object以外的資料型別,則在取出該資料時,需要對其進行顯示的型別轉換,才能夠正常使用。而Dictionary則沒有這個問題。
從這方面講的話,Hashtable相當於Dictionary<Object,Object>
Hashtable ht = new Hashtable(); Dictionary<string, int> dic = new Dictionary<string, int>(); ht.Add("A", 1); dic.Add("A", 1); //Console.WriteLine(ht["A"]+1); //編譯錯誤!Object型別不能和int型別直接進行相加。 Console.WriteLine((int)ht["A"] + 1);//編譯通過,輸出結果為:2 Console.WriteLine(dic["A"] + 1); //編譯通過,輸出結果為:2
第二、讀取資料的順序與新增資料的順序的一致性
Dictionary和Hashtable的讀取資料的順序和新增資料時的資料的順序的一致性均不能夠保證,或者可以說沒有一致性。
Dictionary在只新增不刪除的時候能夠保持讀取資料的順序和新增時候的順序是一致的;
但是經過刪除和新增操作之後,就不能夠保證讀取資料的順序和新增時候的順序一致了。
Dictionary<int, int> dic = new Dictionary<int, int>(); dic.Add(0, 0); dic.Add(1, 1); dic.Add(2, 2); Console.WriteLine("僅僅經過新增元素處理之後:"); foreach (KeyValuePair<int, int> kvp in dic) { Console.WriteLine("Key:" + kvp.Key + " Value:" + kvp.Value); } dic.Remove(0); dic.Add(3, 3); Console.WriteLine("經過刪除和新增元素處理之後:"); foreach (KeyValuePair<int, int> kvp in dic) { Console.WriteLine("Key:" + kvp.Key + " Value:" + kvp.Value); } Console.ReadKey();
對於Dicitionary而言,如果從中刪除一個元素,則之後新新增的元素會填補這個被刪除元素的位置,因而致使新增資料的順序與讀取資料的順序是不一致的。
對於Hashtable而言,它的資料儲存順序是按一定的演算法算出來的,所以絕大多數情況下,它的資料讀取順序和資料新增順序是不一致的。
所以如果你需要保持資料新增時的順序的時候,最好不要用Dictionary和Hashtable。
第三、當用一個不存在的Key值到Hashtable或者Dictionary中取值時
對於Hashtable而言,如果用一個不存在的Key值進行取值的話,會返回一個null;
Hashtable ht = new Hashtable(); Console.WriteLine(ht["b"]==null); Console.ReadKey();
對於Dictionary而言,如果用一個不存在的Key值進行取值的話,會引發“System.Collections.Generic.KeyNotFoundException”型別的異常。
所以在從Dictionary或者Hashtable取值時,可以先判斷Key值是否存在(用ContainsKey()方法進行判斷),以防止出現預期以外的值或者異常。
第四、執行緒安全性
Dictionary不是執行緒安全的,Hashtable是執行緒安全的。
相關文章
- C#集合類(HashTable, Dictionary, ArrayList)與HashTable執行緒安全C#執行緒
- C# 雜湊表Hashtable與字典表Dictionary<K,V>的比較。C#
- c#之hashtable類C#
- 每週一練 之 資料結構與演算法(Dictionary 和 HashTable)資料結構演算法
- hashtable 泛型 C#泛型C#
- c#遍歷HashTableC#
- C#:Dictionary轉DataTableC#
- C# 6.0的Dictionary語法C#
- 字典 dictionary c# 0104C#
- 【C#】-Dictionary的詳細用法C#
- C#比較dynamic和Dictionary效能C#
- c# Dictionary<TKey,TValue>.TryAddC#
- C#中Hashtable和HashMap的區別C#HashMap
- C#中HashTable簡介和使用用法C#
- HashMap 與HashTable的區別HashMap
- C# 遍歷Dictionary並修改其中的ValueC#
- 【C#學習筆記】Dictionary容器使用C#筆記
- C#中Dictionary的內部實現剖析C#
- school dictionary, kids dictionary, children dictionary
- c# combox與hashtable_arraylist填充資料來源與下拉選單框示例C#
- C#之Equals與==C#
- Java集合之Hashtable原始碼解析Java原始碼
- HashTable與ConcurrentHashMap的區別HashMap
- 看動畫學演算法之:hashtable動畫演算法
- hashmap與Hashtable實現原理淺析HashMap
- C# 之委託與事件C#事件
- C#——Dictionary<TKey, TValue> 計算向量的餘弦值C#
- HashMap、Hashtable、ConcurrentHashMap的原理與區別HashMap
- java複習之HashMap和Hashtable的區別JavaHashMap
- 原始碼分析–ConcurrentHashMap與HashTable(JDK1.8)原始碼HashMapJDK
- Java的JDK下Hashtable與HashMap的區別JavaJDKHashMap
- Hashtable/HashMap與key/value為null的關係HashMapNull
- C#中JSON字串和Dictionary字典型別的相互轉換C#JSON字串型別
- C#基礎之yield與SingletonC#
- 深度解析Hashtable
- ARABIC-ENGLISH DICTIONARY: THE HANS WEHR DICTIONARY OF MODERN WRITTEN ARABIC
- 【檢視】oracle 資料字典檢視之 DICT / DICTIONARYOracle
- dataGridView繫結Dictionary |Dictionary繫結到DataGridViewView