首页 > 代码库 > 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 能获得一定方便.