system.arraycopy 是动态属性数组高效扩容的核心手段,通过直接内存块拷贝避免逐个赋值开销;封装时需隐藏数组引用、管理 size/capacity、提供索引存取接口,并采用 1.5x 倍增策略实现平滑扩容。

用面向对象封装动态属性数组时,System.arraycopy 是实现高效、平滑扩容的核心手段——它不依赖反射或泛型擦除,直接操作内存块,避免逐个复制的开销。关键在于把“数组引用 + 容量管理 + 扩容策略”封装进类,让使用者无感扩容过程。
封装属性数组容器类
定义一个泛型容器类(如 DynamicProps),内部持有一个 Object[](或具体类型数组,如 String[]),并维护当前元素数(size)和容量(capacity)。所有属性通过索引存取,不暴露底层数组。
- 构造时指定初始容量,避免频繁扩容
- 提供
get(int index)、set(int index, T value)、add(T value)等方法 - 所有写操作前检查容量,不足则触发扩容逻辑
扩容时用 System.arraycopy 高效迁移
扩容不是新建数组再 for 循环赋值,而是调用 System.arraycopy(src, srcPos, dest, destPos, length) 一次性拷贝有效数据。例如:
// 假设原数组为 props,新容量为 newCap
Object[] newProps = new Object[newCap];
System.arraycopy(props, 0, newProps, 0, size); // 只拷贝实际使用的 size 个元素
props = newProps;
- 源数组起始位置为 0,拷贝长度为
size(不是capacity),避免复制无效占位 - 目标数组偏移为 0,确保数据从头对齐
- 若需在中间插入/删除,仍可用 arraycopy 搬移后段,保持 O(n) 局部性
设计平滑的扩容策略
“平滑”指扩容幅度合理、频次可控、内存不过度浪费。推荐倍增策略(如 1.5x 或 2x),而非固定增量:
- 每次扩容:newCap = Math.max(oldCap + 1, (int)(oldCap * 1.5))
- 对小数组(如 capacity
- 提供
ensureCapacity(int minCapacity)方法供调用方预判扩容,避免临界点性能毛刺
处理泛型与类型安全
Java 泛型擦除下无法直接创建 T[],常用两种方式绕过:
- 用
Object[]存储,对外 get 时强制转型(需信任调用方类型一致性) - 构造时传入
Class<t></t>,用Array.newInstance(clazz, newCap)创建类型化数组(更安全但略重) - 若属性类型固定(如全是
String),直接声明String[],规避泛型问题,性能更优











