6.1 KiB
Hashtable
概念:
Hashtable 是 C# 提供的一个==非泛型键值对集合==
它通过键 key 来查找值 value
简单理解:
像一本字典
用“词”查“解释”
用 key 查 value
命名空间:
using System.Collections;
通常用法
- 保存键值对数据
- 通过唯一键快速查找对应值
- 学习哈希表这种数据结构
- 理解
Dictionary<TKey, TValue>之前的非泛型写法
实际开发中:
新代码更推荐使用 Dictionary<TKey, TValue>
Hashtable 主要用于学习非泛型键值对集合
语法
创建:
Hashtable table = new Hashtable();
添加:
table.Add(键, 值);
通过键取值:
object value = table[键];
修改:
table[键] = 新值;
数量:
table.Count
基础案例
using System;
using System.Collections;
Hashtable table = new Hashtable();
table.Add("name", "小明");
table.Add("age", 18);
table.Add("isVip", true);
Console.WriteLine(table["name"]);
Console.WriteLine(table["age"]);
Console.WriteLine(table["isVip"]);
理解:
"name"、"age"、"isVip"是键"小明"、18、true是值- 通过键可以找到对应的值
Add 和索引器
使用 Add 添加:
Hashtable table = new Hashtable();
table.Add("id", 1001);
table.Add("name", "小明");
使用索引器添加或修改:
table["score"] = 90; // 如果 key 不存在,就是新增
table["score"] = 100; // 如果 key 已存在,就是修改
区别:
Add遇到重复键会报错table[key] = value遇到重复键会覆盖旧值
增删查改
增加:
table.Add("level", 10);
删除:
table.Remove("level");
table.Clear();
查找键:
bool hasName = table.ContainsKey("name");
查找值:
bool hasValue = table.ContainsValue("小明");
修改:
table["name"] = "小红";
取值:
string name = (string)table["name"];
遍历
遍历键值对:
Hashtable table = new Hashtable();
table.Add("name", "小明");
table.Add("age", 18);
foreach (DictionaryEntry item in table)
{
Console.WriteLine(item.Key + " : " + item.Value);
}
只遍历键:
foreach (object key in table.Keys)
{
Console.WriteLine(key);
}
只遍历值:
foreach (object value in table.Values)
{
Console.WriteLine(value);
}
注意:
Hashtable 的遍历顺序不保证等于添加顺序
key 不能重复
错误写法:
Hashtable table = new Hashtable();
table.Add("name", "小明");
table.Add("name", "小红");
原因:
Hashtable 中的 key 必须唯一
重复添加同一个 key 会报错
如果想修改旧值:
table["name"] = "小红";
key 不能是 null
错误写法:
Hashtable table = new Hashtable();
table.Add(null, "值");
原因:
Hashtable 的 key 不能为 null
但是 value 可以是 null:
table.Add("data", null);
取值时要判断 key 是否存在
Hashtable table = new Hashtable();
table.Add("name", "小明");
if (table.ContainsKey("name"))
{
string name = (string)table["name"];
Console.WriteLine(name);
}
为什么要判断:
- key 不存在时,
table[key]可能拿到null - value 本身也可能是
null - 用
ContainsKey可以区分“没有这个键”和“这个键的值是 null”
取值时要类型转换
Hashtable table = new Hashtable();
table.Add("age", 18);
int age = (int)table["age"];
原因:
非泛型 Hashtable 的 key 和 value 都是按 object 处理
取出来后通常需要强制类型转换
如果类型转错:
string age = (string)table["age"];
会出错,因为 "age" 对应的值实际是 int。
和 ArrayList 的区别
| 对比点 | ArrayList | Hashtable |
|---|---|---|
| 存储方式 | 单个元素 | 键值对 |
| 访问方式 | 通过下标 | 通过 key |
| key 是否存在 | 没有 key | key 必须唯一 |
| 常见用途 | 普通列表 | 字典式查找 |
| 泛型替代 | List<T> |
Dictionary<TKey, TValue> |
常见错误
错误1:重复 Add 同一个 key
table.Add("id", 1);
table.Add("id", 2);
应该改成:
table["id"] = 2;
错误2:以为 Hashtable 有添加顺序
实际:
Hashtable 是根据 key 的哈希来组织数据
遍历顺序不保证是添加顺序
错误3:取值后忘记强转
int age = table["age"];
应该写:
int age = (int)table["age"];
注意
Hashtable在System.Collections命名空间中Hashtable是非泛型键值对集合- key 不能重复
- key 不能是
null - value 可以是
null Add重复 key 会报错table[key] = value可以新增,也可以覆盖旧值- 遍历顺序不保证等于添加顺序
- 新项目通常优先使用
Dictionary<TKey, TValue>
一句话记忆
==Hashtable 是用 key 找 value 的非泛型键值对集合。==
再压缩一点: ==ArrayList 靠下标找,Hashtable 靠 key 找。==
面试/复习时怎么说
可以这样答:
“Hashtable 是 System.Collections 命名空间下的非泛型键值对集合,通过唯一 key 查找 value。
它的 key 不能重复,也不能为 null;value 可以为 null。
因为 key 和 value 都按 object 处理,所以取值时通常需要强制类型转换。新项目中一般更推荐使用泛型集合 Dictionary<TKey, TValue>。”
引用:
- Microsoft Learn: Hashtable Class
- Microsoft Learn: Hashtable.Add Method
- Microsoft Learn: Hashtable.Item Property
- Microsoft Learn: System.Collections Namespace
#Hashtable #哈希表 #集合 #进阶