C# Hashtable 哈希表+SortedList 有序键值对集合

一、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 独有特性(区别所有集合)

    1. 唯一自动按键升序的非泛型键值对集合
    1. 同时具备 List索引操作 + Dictionary键操作 双特性
    1. 支持 RemoveAt、GetByIndex、GetKey 索引级操作
    1. 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。

相关推荐
Brilliantwxx1 小时前
【C++】 深入理解红黑树:实现与原理全解
数据结构·c++·笔记·算法·青少年编程·红黑树
Dlrb12112 小时前
数据结构-排序算法
数据结构·算法·排序算法·插入排序·堆排序·希尔排序·快速排序
过期动态2 小时前
【LeetCode 热题 100】无重复字符的最长子串
java·数据结构·spring boot·算法·leetcode·职场和发展
莫等闲-3 小时前
leetcode42. 接雨水 leetcode84.柱状图中最大的矩形
数据结构·c++·算法·leetcode
浅念-3 小时前
LeetCode 记忆化搜索 刷题总结
数据结构·算法·leetcode·职场和发展·深度优先·dfs
菜菜的顾清寒3 小时前
力扣HOT100(44)对称二叉树
数据结构·算法·leetcode
六bring个六3 小时前
c/c++面试踩坑笔记
c语言·数据结构·c++
南境十里·墨染春水3 小时前
数据结构 —— 双向循环链表
数据结构·链表
海清河晏1113 小时前
字符串匹配:BF算法与KMP算法
数据结构·算法·visual studio