数组Array

连续存储元素,通过下标直接访问。

核心约束
元素位置可由起始地址、元素宽度和下标计算。
适用问题
顺序扫描、紧凑存储、频繁按位置访问。
边界与取舍
扩容和中间移动可能昂贵;动态数组追加通常为摊还 O(1)O(1)。
ABCDEF012345
下标 i 直接定位元素:地址 = 起始地址 + i × 元素宽度。

常见操作#

n 为元素数;元素宽度固定,单次复制或比较按常数成本计算。

操作时间复杂度条件与说明
按下标读取 / 覆盖O(1)O(1)下标有效,元素连续存储。
按值查找O(n)O(n)未排序数组顺序查找的最坏情况;有序数组可用二分查找。
尾部追加摊还 O(1)O(1);单次最坏 O(n)O(n)动态数组按几何比例扩容;固定数组没有自动扩容操作。
中间插入 / 删除O(n)O(n)保持原顺序时需要移动后续元素;删除末尾通常为 O(1)O(1)。
遍历 / 从 n 个元素构建O(n)O(n)逐个访问或复制元素,不包含元素内部的深复制。

时间与空间#

时间复杂度
访问 O(1)O(1);移动元素 O(n)O(n)
存储空间
O(n)O(n)

动态数组空间按容量计算;容量与元素数保持常数比例时为 O(n)O(n)。扩容时新旧缓冲区可能短暂共存。

工程中的应用#

7 个案例 · 附源码
nginx·HTTP upstream 配置解析release-1.26.3

nginx 解析 upstream 块时,用 ngx_array_t 连续保存服务器条目;每遇到一条 server 指令便追加一个元素。

附源码片段 · 通信与流量
基础原理参考资料

Java 21 · ArrayList明确区分下标访问、追加的摊还成本与移动元素的线性成本。

7 个概念