HashTable是用存放多個鍵值對的一種集合。其中key,value都是object類型。算法
用foreach遍歷HashTable時,使用DictionaryEntry,也就是說,HashTable的每一組鍵值組合是一個DictionaryEntry。數組
foreach(DictionaryEntry de in myHashTable) { //de.key...; //de.value }
HashTable中,保存數據是一個bucket[],該類型是一個結構體安全
1 private struct bucket 2 { 3 public object key; 4 public object val; 5 public int hash_coll; 6 }
其中hash_coll是key的哈希碼即key.GetHashCode()多線程
HashTable的數據組織方式:由hash_coll%bukect.Length算出一個數組下標,數據放到數組中對應下標的位置中(這是基本算法,還有解決衝突的算法)。取值的時候也是由hashcodespa
因此咱們看到的HashTable中的數據順序相對咱們放入其中的順序是無序的,因此,咱們不能經過hashTable[index]的方式來訪問,這樣會把index看成key線程
HashTable對應一個泛型版本Dictionary<TKey,TValue>code
foreach遍歷Dictionary使用KeyValuePair<Tkey,TValue>blog
區別:hash
1:單線程程序中推薦使用 Dictionary, 有泛型優點, 且讀取速度較快, 容量利用更充分.io
2:多線程程序中推薦使用 Hashtable, 默認的 Hashtable 容許單線程寫入, 多線程讀取, 對 Hashtable 進一步調用 Synchronized() 方法能夠得到徹底線程安全的類型. 而 Dictionary 非線程安全, 必須人爲使用 lock 語句進行保護, 效率大減.
3:Dictionary 有按插入順序排列數據的特性 (注: 但當調用 Remove() 刪除過節點後再Add()就不會再按插入順序排列數據), 所以在須要體現順序的情境中使用 Dictionary 能得到必定方便.