哈希表和字典集合类型

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 中的所有元素指定哈希函数,方法是使用接受 IHashCodeProvider 实现作为其参数之一的 Hashtable 构造函数。

当将对象添加到 Hashtable时,其存储在与哈希代码相关联的存储桶中,此哈希代码匹配该对象的哈希代码。 当在 Hashtable 中对一个值进行搜索时,则为该值生成哈希代码,并搜索与该哈希代码相关联的存储桶。

例如,用于字符串的哈希函数可能采用字符串中每个字符的 ASCII 代码,并将它们加总以生成哈希代码。 字符串“picnic”的哈希代码可能与字符串“basket”的哈希代码不同;因此,字符串“picnic”和“basket”可能在不同的存储桶中。 与此相反,“stressed”和“desserts”可能具有相同的哈希代码,并且位于同一个存储桶中。

Dictionary<TKey,TValue>ConcurrentDictionary<TKey,TValue> 类具有与 Hashtable 类相同的功能。 特定类型(不包括 Object)的 Dictionary<TKey,TValue>Hashtable 相比可为值类型提供更好的性能。 这是因为 Hashtable 的元素属于 Object 类型;因此,装箱和取消装箱通常发生在存储或检索值类型时。 可能有多个线程同时访问该集合时,应使用 ConcurrentDictionary<TKey,TValue> 类。

请参阅