首页 > 代码库 > HashTable

HashTable

HashTable是用存放多个键值对的一种集合。其中key,value都是object类型。

用foreach遍历HashTable时,使用DictionaryEntry,也就是说,HashTable的每一组键值组合是一个DictionaryEntry。

foreach(DictionaryEntry de in myHashTable){    //de.key...;    //de.value}

HashTable中,保存数据是一个bucket[],该类型是一个结构体

1 private struct bucket2 {3     public object key;4     public object val;5     public int hash_coll;6 }

其中hash_coll是key的哈希码即key.GetHashCode()

HashTable的数据组织方式:由hash_coll%bukect.Length算出一个数组下标,数据放到数组中对应下标的位置中(这是基本算法,还有解决冲突的算法)。取值的时候也是由hashcode

所以我们看到的HashTable中的数据顺序相对我们放入其中的顺序是无序的,所以,我们不能通过hashTable[index]的方式来访问,这样会把index当作key

HashTable对应一个泛型版本Dictionary<TKey,TValue>

foreach遍Dictionary使用KeyValuePair<Tkey,TValue>

1:单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.

2:多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减.

3:Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后再Add()就不会再按插入顺序排列数据), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便.