数组适合按顺序存取、支持重复和索引操作;Set适合去重和快速判断存在性;Map适合键值对存储、任意类型键和高效查找。

选数组、Set 还是 Map,关键看你要解决什么问题:要按顺序存取、支持重复、需要索引操作,选数组;要去重、快速判断存在性,选 Set;要存键值对、需要灵活的键类型和高效查找,选 Map。
需要保持插入顺序 + 支持重复元素 → 用数组
数组天然有序、支持下标访问、可遍历、可修改,适合大多数线性数据场景。
- 比如:用户操作日志、表单输入历史、待办任务列表(允许重复添加同一事项)
- 支持
push/pop/shift/unshift、map/filter/find等丰富方法 - 注意:
includes或indexOf查找是 O(n),大量查找时性能不如 Set/Map
只关心“有没有”,且不允许重复 → 用 Set
Set 是去重容器,内部基于哈希实现,插入、删除、查找平均都是 O(1),且自动忽略重复值。
- 比如:已读文章 ID 集合、用户已选标签、临时去重(
[...new Set(arr)]) - 不支持索引访问,也不能直接通过键取值;只有
add、has、delete、size等基础操作 - 遍历时按插入顺序,但不能像数组那样用
arr[0]取第一个元素(需转数组或用迭代器)
需要键值映射 + 键可以是任意类型 → 用 Map
Map 允许对象、函数、Symbol 甚至 null 作为键,比 Object 更健壮;也保持插入顺序,查找效率稳定 O(1)。
立即学习“Java免费学习笔记(深入)”;
- 比如:缓存(以 DOM 元素为键存对应配置)、路由参数解析(字符串键 → 处理函数)、计数统计(
map.get(item) || 0) - 对比 Object:不会被原型链干扰(
map.has('toString')安全),size属性直接可用,遍历更自然 - 如果键全是字符串,且不需要动态增删或复杂逻辑,Object 仍够用;但涉及非字符串键或高频增删查,优先 Map
简单总结:对照需求快速判断
→ 要下标?要多次 push?要 map 处理?→ 数组
→ 只想存一堆唯一值,频繁 has 判断?→ Set
→ 每个值都对应一个明确的“名字”(键),而且这个“名字”可能是对象或数字?→ Map










