java中无原生可变长度数组,需封装普通数组实现动态扩容缩容:维护size与capacity分离,扩容时按1.5倍增长并复制元素,缩容在填充率≤25%时减半且不低于最小容量。

Java 中没有原生的“可变长度数组”,但可以通过封装普通数组,手动实现动态扩容与缩容逻辑。核心思路是:内部维护一个固定长度数组,当容量不足时创建更大数组并复制元素;当元素大量删除、空间冗余过多时,创建更小数组回收内存。
动态扩容:在添加元素时自动增长
扩容通常发生在 add() 或类似方法中,判断当前元素数量是否已达数组长度。若已满,则新建一个更大容量(常见为 1.5 倍或 2 倍)的数组,用 System.arraycopy() 或 Arrays.copyOf() 复制原有数据。
- 推荐扩容因子为 1.5 倍(如
newCapacity = oldCapacity + (oldCapacity >> 1)),平衡内存占用与复制开销 - 避免每次只增 1 —— 那会导致频繁复制,时间复杂度退化为 O(n²)
- 首次扩容可设最小容量(如 10),防止小对象反复分配
动态缩容:在删除大量元素后主动收缩
缩容不是必须操作,但对长期运行、增删频繁的场景很重要。一般在 remove() 后检查:若实际元素数 ≤ 容量的 1/4(即填充率 ≤ 25%),则缩小为当前容量的一半(但不低于初始容量)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 不建议“删一个缩一次”,应设置阈值防止抖动(thrashing)
- 缩容下限要设保护值(如最小容量 8),避免反复扩缩
- 可用
Arrays.copyOf(elementData, newCapacity)快速截取前 newCapacity 个元素
关键细节:size 与 capacity 的分离管理
必须维护两个独立变量:size(当前有效元素个数)和 capacity(底层数组长度)。所有读写操作以 size 为界,扩容缩容只影响 capacity 和底层数组引用。
-
get(i)应校验i ,而非 <code>i -
set(i, e)同样只允许修改[0, size)范围内位置 - 清空操作(
clear())只需置size = 0,无需立即缩容或置 null(除非显式要求释放内存)
参考实现片段(简化版)
以下是一个极简的动态数组骨架:
public class DynamicArray<e> {
private Object[] elementData;
private int size;
private static final int DEFAULT_CAPACITY = 10;
<pre class="brush:java;toolbar:false;">public DynamicArray() {
this.elementData = new Object[DEFAULT_CAPACITY];
}
public void add(E e) {
if (size == elementData.length) {
grow();
}
elementData[size++] = e;
}
private void grow() {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1); // 1.5x
elementData = Arrays.copyOf(elementData, newCapacity);
}
public E remove(int index) {
E oldValue = (E) elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0) {
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
}
elementData[--size] = null; // help GC
if (size > 0 && size == elementData.length / 4) {
shrink();
}
return oldValue;
}
private void shrink() {
int newCapacity = elementData.length / 2;
if (newCapacity >= DEFAULT_CAPACITY) {
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










