类System.Collections.Hashtable和System.Collections.Generic.Dictionary<TKey,TValue>System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue>泛型类实现System.Collections.IDictionary接口。 Dictionary<TKey,TValue>泛型类还实现IDictionary<TKey,TValue>泛型接口。 因此,这些集合中的每个元素都是键值对。
对象 Hashtable 由包含集合元素的存储桶组成。 在Hashtable中,桶是元素的虚拟子组,这使得搜索和检索比大多数集合更容易、更快速。 每个存储桶都与哈希代码相关联,该代码是使用哈希函数生成的,并且基于元素的键。
泛型 HashSet<T> 类是包含唯一元素的无序集合。
哈希函数是基于键返回数值哈希代码的算法。 键是所存储对象的某些属性的值。 哈希函数必须始终为同一键返回相同的哈希代码。 哈希函数可以针对两个不同的键生成相同的哈希代码,但为每个唯一键生成唯一哈希代码的哈希函数在从哈希表中检索元素时会提供更好的性能。
用作元素的每个 Hashtable 对象都必须能够使用方法的 GetHashCode 实现为自己生成哈希代码。 您还可以通过使用接受Hashtable实现作为参数之一的Hashtable构造函数,为IHashCodeProvider中的所有元素指定哈希函数。
当将对象添加到 Hashtable时,其存储在与哈希代码相关联的存储桶中,此哈希代码匹配该对象的哈希代码。 在搜索值 Hashtable时,将为该值生成哈希代码,并搜索与该哈希代码关联的存储桶。
例如,字符串的哈希函数可能采用字符串中每个字符的 ASCII 代码,并将它们一起添加以生成哈希代码。 字符串“野餐”将具有与字符串“basket”的哈希代码不同的哈希代码;因此,字符串“野餐”和“篮子”将位于不同的桶中。 相比之下,“stressed”和“desserts”将具有相同的哈希值,并且会位于同一个哈希桶中。
Dictionary<TKey,TValue>和ConcurrentDictionary<TKey,TValue>类的功能与Hashtable类相同。 特定类型的Dictionary<TKey,TValue>(而不是Object)在处理值类型时比Hashtable提供更好的性能。 这是因为 Hashtable 的元素属于 Object 类型;因此,装箱和取消装箱通常发生在存储或检索值类型时。 ConcurrentDictionary<TKey,TValue>当多个线程可能同时访问集合时,应使用该类。