当前位置: 首页 > news >正文

Map、Dictionary、Hash Table:到底该用哪一个?

开场白

面试常问,代码常写,Google 常搜。
“Map、Dictionary、Hash Table 有啥区别?”
今天用一篇博客讲透:它们分别活在哪一层、各有什么超能力,以及——真正写代码时怎么选


1. Hash Table(哈希表)

1.1 定义

最底层的数据结构:数组 + Hash 函数 + 冲突解决策略(Separate Chaining / Open Addressing / Robin-Hood…)。

1.2 超能力

  • 均摊时间复杂度 O(1):增、删、查。

  • 内存紧凑:指针可控、Cache-Friendly。

  • 可高度定制:开放地址省指针,Robin-Hood 省 CPU Cache Miss。

1.3 适用场景

  • 写底层库:Redis dict、Linux 路由表、数据库索引。

  • 性能极限场景:游戏引擎 ECS、高频交易系统撮合引擎。
    一句话:当你需要“把哈希函数握在自己手里”时,选 Hash Table。


2. Dictionary(字典)

2.1 定义

各大语言标准库对“基于 Hash Table 的键值容器”的统称:

  • C# Dictionary<TKey,TValue>

  • Python dict

  • Swift Dictionary<Key, Value>

2.2 超能力

  • 开箱即用get / set / remove / ContainsKey 一套带走。

  • 键类型 = 可哈希且可相等(string、number、enum…)。

  • 无序:语义上不保证遍历顺序(Python 3.7+ 只是实现细节)。

2.3 适用场景

99% 的业务代码都适合:

  • 根据 userId 找用户

  • 根据枚举值拿配置

  • 缓存序列化结果、计数器
    一句话:不想造轮子,只想把键值塞进一个黑盒,用 Dictionary。


3. Map(映射)

3.1 定义

ES6 / Java / TypeScript 中的“高配”键值容器。

3.2 超能力

  • 键可以是任意类型:对象、Symbol、函数、NaN。

  • 记住插入顺序:天然可迭代,for…of 顺序稳定。

  • size 直读:不用 Object.keys(obj).length

  • 弱引用版本WeakMap 防内存泄漏。

3.3 适用场景

  • 键必须是 DOM 节点 / 对象 / Symbol(事件总线、元数据挂载)。

  • 需要 稳定顺序(LRU Cache、插件加载顺序)。

  • 高频增删且不想踩 __proto__ 坑。
    一句话:当 Dictionary 的键类型或顺序限制让你抓狂,上 Map。


4. 横向对比表(收藏级)

表格

复制

维度Hash TableDictionaryMap
抽象层级数据结构裸实现标准库封装标准库高配封装
键类型限制自己定可哈希标量任意类型
插入顺序无保证无保证保留
时间复杂度O(1) 均摊O(1) 均摊O(1) 均摊(略慢,可忽略)
API 丰富度0(自己写)中等高(迭代器、WeakMap)
业务代码开闭原则❌ 开✅ 闭✅ 闭
典型用途写底层、性能极限99% 业务键值存储对象键 / 顺序敏感

5. 一句话选型口诀(背下来)

  • 键是字符串 / 数字?Dictionary

  • 键是对象 / Symbol / 要顺序?Map

  • 需要魔改哈希函数、榨干最后一滴性能?Hash Table


6. 彩蛋:代码片段对照

// Dictionary 写法(TypeScript)
const users: Record<string, User> = {};// Map 写法(TypeScript)
const usersMap = new Map<string, User>();// 自己撸 Hash Table(C 伪代码)
struct Entry { char* key; void* val; };
Entry table[1024];
uint32_t hash(char* k) { /* djb2 */ }

如果这篇博客帮你在面试或 CR 中少吵一次架,点个 👍 再走吧!

http://www.xdnf.cn/news/1305037.html

相关文章:

  • 机械学习---- PCA 降维深度解析
  • 朗空量子与 Anolis OS 完成适配,龙蜥获得抗量子安全能力
  • redis-保姆级配置详解
  • 焊接机器人保护气体效率优化
  • 18- 网络编程
  • NAS播放器的新星,一站式全平台媒体库管理工具『Cinemore』体验
  • 文档对比(java-diff-utils)
  • HTML5新增属性
  • 【机器学习深度学习】OpenCompass 评测指标全解析:让大模型评估更科学
  • 从前端框架到GIS开发系列课程(26)在mapbox中实现地球自转效果,并添加点击事件增强地图交互性
  • 物联网(IoT)系统中,通信协议如何选择
  • 20250815在荣品RD-RK3588-MID开发板的Android13下调通TP芯片FT8206
  • 智慧零碳园区——解读2025 零碳产业园区实施路径规划【附全文阅读】
  • MqSQL中的《快照读》和《当前读》
  • SQL182 连续两次作答试卷的最大时间窗
  • C++第二十课:快递运费计算器 / 黑白配+石头剪刀布小游戏
  • Linux入门(十九)定时备份数据库
  • 第1篇_Go语言初探_环境搭建与HelloWorld
  • 802.11 Wi-Fi 竞争机制深度分析:CSMA/CA 与 DCF
  • 机器学习之PCA降维
  • Scrapy + Django爬虫可视化项目实战(二) 详细版
  • 轴机械臂cad【7张】三维图+设计说明书
  • 25.Linux 聚合链路与软件网桥
  • XXL-TOOL v2.0.0 发布 | Java工具类库
  • AI创业公司分析:Paloma
  • 自定义数据集(pytorchhuggingface)
  • SaltStack 基础
  • 【机器人-基础知识】ROS常见功能架构
  • 考研复习-计算机组成原理-第七章-IO
  • OpenCV---morphologyEx形态学操作