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

相关文章
相关标签/搜索