HashTable

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 能得到必定方便.

相關文章
相關標籤/搜索