一、Hashtable 核心定义(必背)
Hashtable 是 .NET 早期非泛型键值对集合,和 Dictionary 功能一致,都是键值对存储。
底层基于哈希算法:Key 通过哈希函数算出哈希码 → 直接定位存储位置,查找速度极快。
现状:已被 Dictionary 完全淘汰替代
核心缺点
-
非泛型,Key、Value 全部默认 object 类型
-
类型不安全,任意类型键值混搭
-
存储值类型存在装箱、拆箱,性能低
二、Hashtable 代码实战全解析
1. 创建与初始化
Hashtable table = new Hashtable()
{
{1,"这是1" },
{true,"这是true1" },
};
特点:键可以是任意类型(int、bool、string、对象都可以),可以混搭存储。
2. Add() 添加键值对
table.Add(0,"这是0");
table.Add(2, new int[] { 1, 2, 3 });
规则:Key 唯一,重复添加报错,Value 允许重复、允许任意对象(数组、集合、自定义对象)。
3. Count 获取个数
Console.WriteLine(table.Count);
所有集合统一:集合/字典/哈希表都是 Count,只有数组是 Length。
4. 取值、修改
// 取值
Console.WriteLine(table[1]);
// 修改:同名key直接覆盖值
table[1] = 100;
Console.WriteLine(table[1]);
取值特点:取出的数据是 object 类型,需要手动拆箱转换。
5. 获取所有 Keys / Values
table.Keys; // 获取全部键集合
table.Values; // 获取全部值集合
和字典一样:不支持下标索引访问,只能遍历或转数组。
6. 移除、清空、包含判断
table.Remove(0); // 根据键移除指定键值对
// table.Clear(); // 清空所有数据
table.ContainsKey(0); // 判断是否包含指定键,返回bool
7. 遍历方式
// 只遍历值
foreach (var item in table.Values)
{
Console.WriteLine(item + "---");
}
// 完整遍历键值对
foreach (DictionaryEntry item in table)
{
Console.WriteLine(item.Key + ":" + item.Value);
}
注意:Hashtable 遍历必须用 DictionaryEntry 接收键值对。
三、Hashtable VS Dictionary 终极必考对比
| 对比维度 | Hashtable 哈希表 | Dictionary 泛型字典 |
|---|---|---|
| 泛型 | 非泛型 | 泛型 <K,V> |
| 存储类型 | 全部是 object,任意类型混搭 | 固定单一类型,类型约束严格 |
| 类型安全 | 不安全 | 绝对安全 |
| 装箱拆箱 | 有,性能低 | 无,性能高 |
| 遍历接收 | DictionaryEntry | KeyValuePair |
| 使用状态 | 过时、淘汰、仅考试 | 项目主流、官方推荐 |
四、全套集合终极大闭环(数组/List/ArrayList/Hashtable/Dictionary)
1. 顺序集合
-
数组:固定长度、性能最高、类型安全
-
ArrayList:动态、非泛型、过时、装箱拆箱
-
List<T>:动态、泛型、安全、项目首选
2. 键值对集合
-
Hashtable:非泛型、不安全、过时
-
Dictionary:泛型、安全、高性能、首选
五、考前速记口诀
-
哈希表是老版本,非泛型存 object
-
类型不安全装箱,全部被字典替代
-
键唯值多可混搭,哈希寻址查询快
-
遍历要用Entry,新版字典Pair来
SortedList 有序键值对集合
一、SortedList 核心本质(必考)
SortedList:自动根据 Key 升序排序的非泛型键值对集合
核心特点
-
属于键值对集合(类似 Hashtable / Dictionary)
-
自动根据 Key 从小到大升序排序(最大特色)
-
Key 唯一、不允许重复,Value 可重复
-
非泛型,存储 object 类型,类型不安全、存在装箱拆箱
-
同时支持【键操作】和【索引操作】(兼顾字典+列表特性)
致命易错点
集合内所有 Key 必须是可比较的同一类型!
例如:不能同时存数字Key和字符串Key,类型混杂无法比较排序,直接报错。
二、代码逐行精讲 + 全套API
1. SortedList 创建与初始化(自动排序)
SortedList list = new SortedList()
{
{13,"秦琼"},
{10,"罗成"},
{3,"裴元庆" },
{2,"宇文成都" },
{1,"李元霸"},
};
看似乱序添加,底层自动按 Key 升序重排
最终排序顺序 Key:1、2、3、10、13
2. Add 添加键值对
list.Add(4,"熊阔海");
新增元素会自动插入到正确排序位置,无需手动排序。
3. 修改键值对
list[10] = "杨林";
通过 Key 赋值,存在则覆盖 Value,不存在则新增键值对。
4. 两种删除方式(超级重点|区分考点)
list.Remove(4); // 根据【键】删除
list.RemoveAt(3); // 根据【索引下标】删除
// list.Clear(); // 清空所有键值对
-
Remove(Key):删除指定键的整组数据(字典风格)
-
RemoveAt(index):删除指定下标位置数据(列表风格)
SortedList 独有:同时支持键删除 + 索引删除
5. 获取全部键、全部值
Console.WriteLine(list.Keys);
Console.WriteLine(list.Values);
6. 索引取值、取键(独家方法)
// 根据索引取 Value
Console.WriteLine(list.GetByIndex(0));
// 根据索引取 Key
Console.WriteLine(list.GetKey(0));
规则:索引0 永远对应最小的Key(因为自动升序)
7. 下标for循环遍历(仅限SortedList)
for (int i = 0; i < list.GetValueList().Count; i++)
{
Console.WriteLine( list.GetValueList()[i]+"------------");
}
普通 Dictionary/Hashtable 不支持下标遍历,SortedList 支持
8. foreach 遍历
foreach (var item in list.Values)
{
Console.WriteLine(item+"++++");
}
三、SortedList 独有特性(区别所有集合)
-
- 唯一自动按键升序的非泛型键值对集合
-
- 同时具备 List索引操作 + Dictionary键操作 双特性
-
- 支持 RemoveAt、GetByIndex、GetKey 索引级操作
-
- Key 类型必须统一可比较,否则程序报错
四、SortedList VS Hashtable VS Dictionary 极简对比
| 集合 | 是否排序 | 泛型 | 索引访问 | 特点 |
|---|---|---|---|---|
| Hashtable | 无序 | 非泛型 | 不支持 | 快速查找、乱序 |
| Dictionary | 无序 | 泛型安全 | 不支持 | 项目主流、高性能 |
| SortedList | 自动按键升序 | 非泛型 | 支持 | 有序键值对、双访问方式 |
五、考前速记口诀
-
SortedList有序集合,键值存储自动排序
-
键唯可比类型统一,混搭报错不能运行
-
支持按键删改查,也可索引操作数据
-
GetByIndex取值,GetKey索引取键
-
字典哈希无序乱,有序首选排序列表
SortedList 和 Dictionary 核心区别
1. 排序特性(最大区别)
Dictionary:无序存储,不保证键的顺序,存取速度快。
SortedList:自动根据 Key 升序排序,全程有序。
2. 泛型与类型安全
Dictionary:泛型集合 <K,V>,类型安全、无装箱拆箱、性能高。
SortedList:原生为非泛型,存储 object,类型不安全、存在装箱拆箱、性能低。
3. 访问方式
Dictionary:只能通过 Key 访问,不支持索引遍历。
SortedList:既可以 Key 访问,也可以通过索引访问(支持 GetByIndex、GetKey、RemoveAt)。
4. 遍历方式
Dictionary:不能用 for 下标遍历,只能 foreach。
SortedList:支持 for 索引遍历 + foreach 遍历。
5. 性能场景
Dictionary:增删查速度更快,项目开发首选。
SortedList:排序消耗性能,适合需要自动按键排序的场景。
6. Key 要求
Dictionary:Key 无排序要求,任意合法类型即可。
SortedList:所有 Key 必须同类型、可相互比较,类型混搭直接报错。
极简背诵版
Dictionary 无序、泛型安全、只能按键访问、项目主流。
SortedList 自动有序、非泛型不安全、支持索引 + 按键双访问。
要排序用 SortedList,要性能和安全用 Dictionary。