在编程中,数组(Array)和映射(Map,或称字典、哈希表)是两种常用的数据结构,但它们的特性、用途和实现方式有显著差异。以下是两者的主要区别:


存储结构

数组

• 存储连续内存空间中的一组元素,元素通过整数索引(如 0, 1, 2...)访问。

• 元素类型通常统一(如整数数组、字符串数组)。

• 大小固定(静态数组)或可动态扩展(动态数组,如 Python 的 list)。

映射(Map)

• 存储键值对(Key-Value Pairs),键(Key)用于唯一标识值(Value)。

• 内存分布通常非连续,基于哈希表或树结构实现。

• 大小动态变化,无需预先定义容量。


访问方式

数组

• 通过索引直接访问元素,时间复杂度为 O(1)

• 按值查找需要遍历,时间复杂度为 O(n)

• 插入/删除元素可能需要移动其他元素(如静态数组),时间复杂度为 O(n)

映射(Map)

• 通过键(Key)访问值,平均时间复杂度为 O(1)(哈希表实现)或 O(log n)(树实现,如 C++ std::map)。

• 插入、删除、查找操作通常高效,无需遍历全部元素。


键的类型

数组

• 索引必须是整数(如 0, 1, 2...)。

映射(Map)

• 键可以是任意数据类型(如字符串、对象、数字等),取决于语言支持(如 Python 的字典、JavaScript 的 Map)。


顺序性

数组

• 有序,元素顺序由插入顺序或索引决定。

映射(Map)

• 传统实现(如哈希表)不保证顺序,但某些语言支持有序映射(如 Python 3.7+ 的字典、Java 的 LinkedHashMap)。


重复性

数组

• 允许重复元素。

映射(Map)

• 键(Key)必须唯一,重复插入会覆盖旧值;值(Value)可以重复。


内存与性能

数组

• 内存紧凑,适合顺序访问或需要缓存友好的场景(如数值计算)。

• 动态数组扩容时可能有临时性能开销。

映射(Map)

• 内存占用较高(需存储键、值及哈希结构)。

• 哈希冲突可能影响性能(但现代实现通常优化较好)。


典型用途

数组

• 存储有序集合,如列表、矩阵、缓冲区数据。

• 适用于需要频繁按索引访问或遍历的场景。

映射(Map)

• 快速查找键值对,如缓存、数据库索引、词频统计。

• 表示关联关系,如用户 ID 到用户信息的映射。


示例对比

数组

scores = [90, 85, 78]  # 索引 0 对应第一个分数
print(scores[0])       # 输出 90

映射(Map)

student_grades = {"Alice": 90, "Bob": 85}  
print(student_grades["Alice"])  # 输出 90

总结

特性 数组 映射(Map)
访问方式 整数索引 任意类型键
顺序性 有序 通常无序(部分实现有序)
重复元素 允许 键唯一,值可重复
查找效率 按索引 O(1),按值 O(n) 按键平均 O(1) 或 O(log n)
适用场景 顺序数据、高频索引访问 键值关联、快速查找