arraylist底层基于数组实现,扩容时创建新数组并复制数据;触发时机为add时size等于数组长度;默认容量10,扩容规则为旧容量1.5倍(oldcapacity + oldcapacity >> 1),不足时直接取所需容量。

ArrayList 底层用数组存储元素,当添加元素超出当前容量时,会自动扩容——不是“动态调整大小”,而是创建新数组、复制数据、替换引用。
扩容触发时机
调用 add(E e) 方法时,如果 size == elementData.length(即已满),就会触发扩容。
- 构造时未指定初始容量,默认容量为 10
- ensureCapacityInternal() 检查是否需要扩容
- 实际扩容逻辑在 grow() 方法中执行
扩容计算规则
新容量 = 旧容量 × 1.5(即 oldCapacity + oldCapacity >> 1)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 比如原数组长度为 10,扩容后为 15;再扩容为 22(15 + 7)
- 使用位运算是为了效率,等价于乘以 1.5
- 若计算结果仍小于所需最小容量(比如一次性 addAll 很多元素),则直接取所需容量
扩容具体步骤
核心是 Arrays.copyOf(elementData, newCapacity),本质是:
- 用 new Object[newCapacity] 创建新数组
- 调用 System.arraycopy() 把旧数组内容复制过去
- 将 elementData 引用指向新数组
- 旧数组失去引用,后续由 GC 回收
手动控制扩容行为
避免频繁扩容影响性能,可提前预估容量:
- 构造时传入合理初始容量:new ArrayList(initialCapacity)
- 添加大量数据前调用 ensureCapacity(minCapacity)
- 注意:trimToSize() 可缩容到当前 size,释放多余空间
扩容本身不可见,但涉及内存分配和数组拷贝,属于相对重的操作。理解它有助于写出更高效的集合使用代码。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










