ArrayList底层是动态数组,初始为空数组,首次添加时分配默认容量10;扩容时按1.5倍增长并复制元素;get为O(1),remove为O(n);支持null和重复元素。

ArrayList 的底层就是一段连续的内存空间,也就是动态数组。它不是一创建就固定大小,而是根据需要自动扩容,既保持了数组随机访问快的优点,又解决了普通数组长度不可变的问题。
初始容量与数组创建
当你 new 一个 ArrayList(比如 new ArrayList()),它内部会初始化一个空数组(JDK 8 中是 Object[] elementData = {}),实际首次添加元素时才分配默认容量(通常是 10)。这个数组就是真正的数据容器,所有元素按插入顺序依次存放,下标从 0 开始。
添加元素时如何“动态”扩容
当数组已满(size == elementData.length),再调用 add() 就会触发扩容:
- 计算新容量:一般是原容量的 1.5 倍((oldCapacity >> 1) + oldCapacity)
- 创建新数组:用 Arrays.copyOf() 把旧数组内容复制到更大新数组中
- 更新引用:把 elementData 指向新数组,后续操作都在新空间进行
删除和查询为什么快
因为底层是数组,所以:
立即学习“Java免费学习笔记(深入)”;
- get(int index) 是 O(1):直接通过下标计算内存地址,无需遍历
- remove(int index) 是 O(n):删中间元素后,要把后面所有元素往前挪一位(用 System.arraycopy() 高效完成)
- 不支持真正意义上的“逻辑删除”,每次删都会改变物理位置
注意几个关键细节
动态数组不是无限增长,扩容本身有开销;频繁 add 可以提前指定初始容量避免多次复制。另外,ArrayList 允许 null,也允许重复元素,这些都由数组直接承载,没有额外结构约束。


















