C# -Dictionary、HashTable、List、HashSet区别

在.Net  模仿java 的过程中,抛弃了 HashMap,所以我们今天分析下Dictionary、HashTable、HashSet区别。

处理碰撞,即碰撞到同一个Bucket槽上:

Hashtable和Dictionary从数据结构上来说都属于Hashtable(哈希表),都是对关键字(键值)进行散列操作,将关键字散列到Hashtable的某一个槽位中去,不同的是处理碰撞的方法。散列函数有可能将不同的关键字散列到Hashtable中的同一个槽中去,这个时候我们称发生了碰撞,为了将数据插入进去,我们需要另外的方法来解决这个问题。

Dictionary采用链表法处理碰撞:

int hashCode = comparer.GetHashCode(key) & 0x7FFFFFFF;
//将HashCode的返回值转化为数组索引
int bucketIndex = hashCode % buckets.Length;


通过Hash算法来碰撞到指定的Bucket上,碰撞到同一个Bucket槽上所有数据形成一个单链表。

HashTable采用开放寻址法方法中的双重散列处理碰撞:

双重散列:

h(k,i) = (h1(k) +i*h2(k)) mod m  (其中i = 0,1,…,m-1),其中h1和h2为辅助散列函数。初始探查位置为T(h1(k)), 后续的探查位置在此基础上加上偏移量h2(k)模m 。

你可能感兴趣的:(c#,开发语言)