现在位置: 首页 > C# 教程 > 正文

C# 哈希表(Hashtable)

C# 集合 C# 集合

在 C# 中,哈希表(Hashtable) 是一种以键值对(key=>value)形式存储数据的集合,键和值可以是任意对象。

哈希表中的每一项都有一个key=>value对,key 用于访问集合中的项目。

哈希表基于哈希算法组织和访问数据,提供高效的查找、插入和删除操作。

Hashtable 是非泛型集合,位于命名空间 System.Collections 中。如果需要泛型版本,可以使用 Dictionary<TKey, TValue>。

基本结构:

  • 键(Key):用于标识每个数据项,必须是唯一的,不能为 null。
  • 值(Value):键所对应的数据,可以为 null。

特点:

  • 键值对存储:每个键都是唯一的,与一个值相关联。
  • 哈希算法:通过键的哈希码定位数据存储位置,查找和插入操作的平均时间复杂度为 O(1)。
  • 动态调整容量:当哈希表中元素数目超过容量时,表会动态扩展并重新分配存储。
  • 无序存储:键值对的存储顺序与插入顺序无关,由哈希码决定。

Hashtable 类的方法和属性

下表列出了 Hashtable 类的一些常用的 属性:

属性名称类型描述
Countint获取哈希表中包含的键值对数量。
IsReadOnlybool指示哈希表是否为只读。
IsFixedSizebool指示哈希表是否具有固定大小。
IsSynchronizedbool指示哈希表是否线程安全。
KeysICollection获取哈希表中所有键的集合。
ValuesICollection获取哈希表中所有值的集合。
SyncRootobject获取可用于同步访问哈希表的对象。

下表列出了 Hashtable 类的一些常用的 方法:

方法名称返回类型描述
添加与删除
Add(object key, object value)void将指定的键值对添加到哈希表。
Clear()void清空哈希表。
Remove(object key)void删除指定键的键值对。
查询与访问
Contains(object key)bool判断哈希表中是否包含指定键。
ContainsKey(object key)bool判断哈希表中是否包含指定键(等效于 Contains)。
ContainsValue(object value)bool判断哈希表中是否包含指定值。
复制与枚举
CopyTo(Array array, int index)void将哈希表的元素复制到数组,从指定索引处开始。
GetEnumerator()IDictionaryEnumerator返回哈希表的枚举器,用于遍历键值对。

实例

下面的实例演示了哈希表(Hashtable)的概念:

实例

using System;
using System.Collections;

namespace CollectionsApplication
{
   class Program
   {
      static void Main(string[] args)
      {
         Hashtable ht = new Hashtable();


         ht.Add("001", "Zara Ali");
         ht.Add("002", "Abida Rehman");
         ht.Add("003", "Joe Holzner");
         ht.Add("004", "Mausam Benazir Nur");
         ht.Add("005", "M. Amlan");
         ht.Add("006", "M. Arif");
         ht.Add("007", "Ritesh Saikia");

         if (ht.ContainsValue("Nuha Ali"))
         {
            Console.WriteLine("This student name is already in the list");
         }
         else
         {
            ht.Add("008", "Nuha Ali");
         }
         // 获取键的集合
         ICollection key = ht.Keys;

         foreach (string k in key)
         {
            Console.WriteLine(k + ": " + ht[k]);
         }
         Console.ReadKey();
      }
   }
}

当上面的代码被编译和执行时,它会产生下列结果:

007: Ritesh Saikia
004: Mausam Benazir Nur
005: M. Amlan
008: Nuha Ali
002: Abida Rehman
003: Joe Holzner
001: Zara Ali
006: M. Arif

与其他集合的对比

特性HashtableDictionary<TKey, TValue>
类型安全否(非泛型,存储 object 类型)是(泛型,强类型约束)
性能较慢(需进行装箱和拆箱操作)更快(无装箱操作,泛型直接支持类型)
键的唯一性是是
值是否可为 null是是
排序无无
线程安全默认非线程安全默认非线程安全
  • Hashtable 是一种高效的键值对集合,适用于需要快速存储和检索键值对的场景。
  • 非泛型 的设计使其在类型安全和性能方面逊色于泛型版本的集合(如 Dictionary<TKey, TValue>)。
  • 在现代 C# 开发中,Dictionary<TKey, TValue> 更常被使用,但 Hashtable 仍然适合简单应用或与遗留代码兼容的场景。

C# 集合 C# 集合