C#Hash table:哈希表
在 C# 中,Hashtable(哈希表) 类表示根据键的哈希代码进行组织的键(key)/值(value)对的集合,可以使用键来访问集合中的元素。也就是说当您需要使用键来访问指定元素时,可以选择使用哈希表。C# Hashtable(哈希表)例程,涵盖了哈希表的基本操作、属性访问、线程同步以及性能优化。该程序演示了如何创建哈希表、添加/删除元素、查找元素、遍历集合、处理键冲突,并介绍了其在实际开发中的典型使用场景。
using System;
using System.Collections;
class Program
{
static void Main(string[] args)
{
// 创建一个 Hashtable 实例
Hashtable hashtable = new Hashtable();
// 添加键值对
hashtable.Add("ID001", "Alice");
hashtable.Add("ID002", "Bob");
hashtable.Add("ID003", "Charlie");
Console.WriteLine("初始 Hashtable 内容:");
PrintHashtable(hashtable);
// 使用键获取值
string name = (string)hashtable["ID002"];
Console.WriteLine($"\n通过键 'ID002' 获取的值是: {name}");
// 替换已有的键对应的值
hashtable["ID002"] = "Robert";
Console.WriteLine("\n更新后的 Hashtable 内容:");
PrintHashtable(hashtable);
// 删除指定键的条目
hashtable.Remove("ID003");
Console.WriteLine("\n删除键 'ID003' 后的内容:");
PrintHashtable(hashtable);
// 检查键是否存在
bool containsKey = hashtable.ContainsKey("ID004");
Console.WriteLine($"\n是否包含键 'ID004'? {containsKey}");
// 获取键的集合和值的集合
ICollection keys = hashtable.Keys;
ICollection values = hashtable.Values;
Console.WriteLine("\n所有键:");
foreach (string key in keys)
{
Console.WriteLine(key);
}
Console.WriteLine("\n所有值:");
foreach (string value in values)
{
Console.WriteLine(value);
}
// 清空哈希表
hashtable.Clear();
Console.WriteLine($"\n清空后 Hashtable 的 Count 为: {hashtable.Count}");
// 线程安全示例:创建一个同步的 Hashtable
Hashtable syncHashtable = Hashtable.Synchronized(new Hashtable());
Console.WriteLine($"\nIsSynchronized(是否线程安全): {syncHashtable.IsSynchronized}");
// 多线程中使用 SyncRoot 进行同步
lock (syncHashtable.SyncRoot)
{
Console.WriteLine("\n在锁内添加元素以确保线程安全...");
syncHashtable.Add("ThreadKey", "ThreadValue");
}
Console.WriteLine("\n线程安全操作后的内容:");
PrintHashtable(syncHashtable);
}
// 辅助方法:打印 Hashtable 中的所有键值对
static void PrintHashtable(Hashtable table)
{
foreach (DictionaryEntry entry in table)
{
Console.WriteLine($"Key: {entry.Key}, Value: {entry.Value}");
}
}
}
输出结果:
初始 Hashtable 内容:
Key: ID001, Value: Alice
Key: ID002, Value: Bob
Key: ID003, Value: Charlie通过键 'ID002' 获取的值是: Bob
更新后的 Hashtable 内容:
Key: ID001, Value: Alice
Key: ID002, Value: Robert
Key: ID003, Value: Charlie删除键 'ID003' 后的内容:
Key: ID001, Value: Alice
Key: ID002, Value: Robert是否包含键 'ID004'? False
所有键:
ID001
ID002所有值:
Alice
Robert清空后 Hashtable 的 Count 为: 0
IsSynchronized(是否线程安全): True
在锁内添加元素以确保线程安全...
线程安全操作后的内容:
Key: ThreadKey, Value: ThreadValue
程序说明:
-
基本操作:
-
使用
Add()方法向Hashtable中添加键值对。 -
使用索引器
[key]获取或修改值。 -
使用
Remove()删除指定键的条目。 -
使用
ContainsKey()判断键是否存在。
-
-
集合访问:
-
通过
Keys和Values属性分别获取所有的键和值。 -
支持直接遍历
DictionaryEntry对象进行读取。
-
-
线程安全:
-
使用
Hashtable.Synchronized()创建线程安全版本的哈希表。 -
使用
SyncRoot和lock语句确保多线程下的安全访问。
-
-
性能特点:
-
查找、插入和删除的时间复杂度平均为 O(1),但在最坏情况下可能退化为 O(n)。
-
如果键的分布不均或哈希函数设计不好,可能会导致性能下降。
-
更多推荐



所有评论(0)