为什么数组查询这么快,增删却这么痛苦?Java程序员每天打交道的集合类,多数人只停留在"用"的层面。这篇把内存布局、时间复杂度掰开揉碎讲清楚。

数组是Java最原始的聚合方式。它要求元素类型一致,长度固定——要么初始化时写死,要么用new指定容量。代码里常见的int[] notas = {10, 8, 9, 7}背后,是内存里连续排开的4字节整数块。

打开网易新闻 查看精彩图片

连续内存带来O(1)随机访问。地址计算公式很简单:基地址 + 数据类型长度 × 索引。假设notas起始于0x100,取第0个元素就是0x100 + 4×0 = 0x100;取第3个则是0x100 + 4×3 = 0x10C。没有遍历,没有跳转,直接算地址。

但这份效率有代价。内存必须找到一块连续空闲区域,不够大就创建失败。更麻烦的是扩容:数组一旦定型,插入删除都要搬动后续所有元素。这也是为什么Java Collections API存在——它在数组之上封装了动态扩容、自动缩容、类型安全等能力。

实际开发中,学生成绩、待办清单、日期序列这些场景,底层都可能用到数组。但直接操作数组的情况越来越少,List、Set、Map这些接口才是日常。理解数组的内存特性,是选对集合类型的前提——读多写少选数组基底的ArrayList,频繁增删则考虑链表结构的LinkedList。