system.arraycopy本身不扩容,仅高效搬运数据;实现平滑扩容需封装动态数组类(如intarray),统一管理容量增长、引用更新与边界安全,采用1.2~1.5渐进式扩容策略并精准调用arraycopy搬运有效元素。

System.arraycopy 本身不扩容,它只是高效搬运数据的工具。要实现“平滑扩容”的动态一维数组,关键在于把数组封装成一个可管理的对象,由它统一控制容量增长策略、引用更新和边界安全——而不是每次手动 new + copy。
封装动态数组类,隐藏扩容细节
直接暴露原始数组容易出错(比如忘了更新引用、复制长度写错)。推荐封装一个简单容器,例如 IntArray:
- 内部持有一个 int[] data 字段和 int size 记录当前有效元素数
- 提供 add(int value) 方法:检查容量是否足够,不够就触发扩容逻辑
- 扩容时按需计算新长度(如 size × 1.5 向上取整),new 新数组,再用 System.arraycopy 搬数据
- 最后更新 data = newData,并把新值放入 size 位置,size++
采用渐进式扩容策略,避免抖动
“平滑”体现在容量增长不是突兀翻倍,而是贴合实际增长节奏:
OpenJDK 24 Windows x64 官方参考实现(24+36),适合 Windows 环境进行 Java 开发、编译、运行和版本兼容性验证。
- 初始容量设为 8 或 16,避免小数组频繁扩容
- 增长因子建议用 1.2~1.5,比固定 ×2 更节省内存(尤其对中等规模数据)
- 最小增量保障:即使 size 是 1,新容量也不能小于 size + 1,防止单次 add 就触发扩容
- 可参考 ArrayList 的策略:oldCapacity + (oldCapacity >> 1),即增加 50%
利用 System.arraycopy 做精准、零冗余搬运
这是性能核心。每次扩容只需一次调用,参数必须准确:
- 源数组:this.data
- 源起始索引:0(拷贝全部有效元素)
- 目标数组:newData
- 目标起始索引:0
- 拷贝长度:this.size(不是 newData.length!否则会带入默认值污染逻辑)
支持插入/删除时的局部迁移,保持连续性
真正“动态”不止于尾部追加。配合 arraycopy 可低成本实现中间操作:
- 在 index 插入:先将 data[index..size-1] 整体后移一位(arraycopy 到 index+1),再赋值
- 在 index 删除:将 data[index+1..size-1] 整体前移一位(arraycopy 从 index+1 到 index),size--
- 这些操作仍只用一次 arraycopy,且长度可控,不涉及全量重建










