C# 中 Hashtable 学习笔记
1. 基础概念与用法
1.1 什么是 Hashtable?
Hashtable(哈希表) 是 C# 中一种键值对(Key-Value)集合,用于通过唯一的键(Key) 快速查找对应的值(Value)。
- 键(Key)不能为
null,值(Value)可以为null。 - 内部基于哈希算法实现,查找效率高。
- 属于
System.Collections命名空间(非泛型集合)。 - 注意:在现代 C# 开发中,更推荐使用泛型版本
Dictionary<TKey, TValue>,但理解 Hashtable 有助于学习集合演进历史和底层原理。
1.2 常用方法与属性
| 方法/属性 | 说明 |
|---|---|
Add(key, value) |
添加一个键值对(键不能重复) |
Remove(key) |
根据键删除对应项 |
ContainsKey(key) |
判断是否包含指定键 |
ContainsValue(value) |
判断是否包含指定值(效率较低) |
Keys |
获取所有键的集合 |
Values |
获取所有值的集合 |
Count |
获取元素个数 |
1.3 简单示例
using System;
using System.Collections;
class Program
{
static void Main()
{
// 创建 Hashtable
Hashtable ht = new Hashtable();
// 添加键值对
ht.Add("name", "小明");
ht.Add("age", 20);
ht.Add("city", "北京");
// 访问值(需强制类型转换)
string name = (string)ht["name"];
int age = (int)ht["age"];
Console.WriteLine($"姓名:{name},年龄:{age}");
// 遍历 Hashtable
foreach (DictionaryEntry entry in ht)
{
Console.WriteLine($"{entry.Key}: {entry.Value}");
}
}
}
⚠️ 注意:由于 Hashtable 是非泛型集合,存储的是
object类型,取出时必须显式转换类型,容易出错。
2. 进阶知识点
2.1 Hashtable vs Dictionary<TKey, TValue>
| 特性 | Hashtable | Dictionary<TKey, TValue> |
|---|---|---|
| 类型安全 | ❌(存储 object) | ✅(编译时检查类型) |
| 性能 | 稍慢(需装箱/拆箱) | 更快(无装箱拆箱) |
| 泛型支持 | ❌ | ✅ |
| 线程安全 | ✅(部分方法) | ❌(默认不安全) |
| 推荐使用 | 旧项目或特殊需求 | ✅ 现代开发首选 |
💡 建议:除非维护老代码,否则优先使用
Dictionary。
2.2 性能特点
- 查找、插入、删除的平均时间复杂度为 O(1) (常数时间),非常高效。
- 但当哈希冲突严重或负载因子过高时,性能会下降。
- 装箱/拆箱开销:因为存储的是
object,值类型(如int)会被装箱,取出时拆箱,影响性能。
2.3 线程安全性
-
Hashtable 的部分方法是线程安全的:
- 多个读操作可以并发进行。
- 读写操作不能同时进行。
-
可通过
Hashtable.Synchronized(new Hashtable())创建线程安全包装器。 -
但现代开发中更推荐使用
ConcurrentDictionary<TKey, TValue>(来自System.Collections.Concurrent)处理并发场景。
3. 实际工作中的使用场景
虽然 Hashtable 已逐渐被 Dictionary 取代,但在某些场景仍有价值:
3.1 适合使用 Hashtable(或 Dictionary)的业务场景
-
缓存配置信息
比如:将数据库中的“国家代码 → 国家名称”映射加载到内存,快速查询。ht.Add("CN", "中国"); ht.Add("US", "美国"); -
用户会话管理(旧式 Web 应用)
在 ASP.NET Web Forms 中,Session底层曾使用类似 Hashtable 的结构存储用户数据。 -
动态属性存储
当对象属性不确定时,可用 Hashtable 临时存储键值对(如解析 JSON 前的中间结构)。 -
去重与快速查找
利用键的唯一性,避免重复数据(如记录已处理的订单ID)。
🚫 不适合的场景:
- 需要强类型安全的项目(用
Dictionary)。- 高并发写入场景(用
ConcurrentDictionary)。- 需要保持插入顺序(Hashtable 不保证顺序,可用
OrderedDictionary或Dictionary+ List)。
总结
| 项目 | 说明 |
|---|---|
| 优点 | 查找快、支持任意类型键值、部分线程安全 |
| 缺点 | 非泛型、需类型转换、性能不如 Dictionary、不保证顺序 |
| 学习建议 | 理解原理即可,实际开发优先使用 Dictionary<TKey, TValue> |
🌟 一句话记住:
Hashtable 是“老式键值对容器”,快但不安全;Dictionary 是“现代升级版”,快又安全!

天底下没有什么所谓的无心之语,仅有不细心说出的”有心之言。——烽火戏诸侯《剑来》
浙公网安备 33010602011771号