现在位置: 首页 > 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# 集合