C# 哈希表(Hashtable)
在 C# 中,哈希表(Hashtable) 是一种以键值对(key=>value)形式存储数据的集合,键和值可以是任意对象。
哈希表中的每一项都有一个key=>value对,key 用于访问集合中的项目。
哈希表基于哈希算法组织和访问数据,提供高效的查找、插入和删除操作。
Hashtable
是非泛型集合,位于命名空间 System.Collections
中。如果需要泛型版本,可以使用 Dictionary<TKey, TValue>
。
基本结构:
- 键(
Key
):用于标识每个数据项,必须是唯一的,不能为null
。 - 值(
Value
):键所对应的数据,可以为null
。
特点:
- 键值对存储:每个键都是唯一的,与一个值相关联。
- 哈希算法:通过键的哈希码定位数据存储位置,查找和插入操作的平均时间复杂度为 O(1)。
- 动态调整容量:当哈希表中元素数目超过容量时,表会动态扩展并重新分配存储。
- 无序存储:键值对的存储顺序与插入顺序无关,由哈希码决定。
Hashtable 类的方法和属性
下表列出了 Hashtable 类的一些常用的 属性:
属性名称 | 类型 | 描述 |
---|---|---|
Count | int | 获取哈希表中包含的键值对数量。 |
IsReadOnly | bool | 指示哈希表是否为只读。 |
IsFixedSize | bool | 指示哈希表是否具有固定大小。 |
IsSynchronized | bool | 指示哈希表是否线程安全。 |
Keys | ICollection | 获取哈希表中所有键的集合。 |
Values | ICollection | 获取哈希表中所有值的集合。 |
SyncRoot | object | 获取可用于同步访问哈希表的对象。 |
下表列出了 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();
}
}
}
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
与其他集合的对比
特性 | Hashtable | Dictionary<TKey, TValue> |
---|---|---|
类型安全 | 否(非泛型,存储 object 类型) | 是(泛型,强类型约束) |
性能 | 较慢(需进行装箱和拆箱操作) | 更快(无装箱操作,泛型直接支持类型) |
键的唯一性 | 是 | 是 |
值是否可为 null | 是 | 是 |
排序 | 无 | 无 |
线程安全 | 默认非线程安全 | 默认非线程安全 |
Hashtable
是一种高效的键值对集合,适用于需要快速存储和检索键值对的场景。- 非泛型 的设计使其在类型安全和性能方面逊色于泛型版本的集合(如
Dictionary<TKey, TValue>
)。 - 在现代 C# 开发中,
Dictionary<TKey, TValue>
更常被使用,但Hashtable
仍然适合简单应用或与遗留代码兼容的场景。