system.arraycopy不支持直接追加或更新,需手动管理数组大小和位置:追加需扩容并分两次复制,更新需指定覆盖范围并注意越界和重叠问题。

System.arraycopy 本身不直接支持“追加”或“更新”语义,它只是底层的内存块复制工具。所谓追加和更新,都需要你手动管理目标数组大小和位置,再调用它完成数据搬移。
追加:本质是扩容 + 复制
Java 数组长度固定,无法真正追加。所谓追加,其实是创建一个更大的新数组,把原数组内容和待追加内容依次复制进去。
- 先计算新数组长度(原长度 + 新元素个数)
- 用
new创建新数组 - 用
arraycopy把原数组全部复制到新数组开头 - 再用一次
arraycopy把待追加的数组复制到新数组的后续位置
例如,把 src2 追加到 src1 后面:
int[] src1 = {1, 2, 3};
int[] src2 = {4, 5};
int[] dest = new int[src1.length + src2.length];
System.arraycopy(src1, 0, dest, 0, src1.length);
System.arraycopy(src2, 0, dest, src1.length, src2.length);
// dest = [1, 2, 3, 4, 5]
更新:覆盖指定范围的元素
更新即用新值替换原数组中某一段。关键在于确定源数组、目标数组、起始偏移和长度是否匹配。
- 若更新同一数组:源和目标是同一个数组,需注意重叠问题(比如向右移动元素),此时
arraycopy内部会按方向自动处理 - 若从其他数组更新:确保目标索引不越界,且复制长度不超过源数组可用长度
例如,用 newVals 替换 arr 中索引 2 开始的 3 个元素:
int[] arr = {0, 1, 2, 3, 4, 5};
int[] newVals = {9, 8, 7};
System.arraycopy(newVals, 0, arr, 2, 3);
// arr 变为 [0, 1, 9, 8, 7, 5]
常见陷阱与注意事项
用错参数会导致异常或静默错误,务必核对五个参数含义:src, srcPos, dest, destPos, length。
-
srcPos + length不能超过源数组长度,否则抛ArrayIndexOutOfBoundsException -
destPos + length不能超过目标数组长度 - 源和目标可以是同一数组,但若发生重叠(如
srcPos ),复制仍安全;反过来则可能被覆盖前的数据干扰 - 基本类型数组和对象数组都适用,但对象数组复制的是引用,不是深拷贝
替代方案建议
日常开发中,频繁追加/更新数组建议改用更合适的结构:
- 追加场景优先用
ArrayList,它内部自动扩容,add()就是封装好的“追加” - 需要高性能批量操作时,可考虑
Arrays.copyOf或Arrays.copyOfRange,它们底层也调arraycopy,但封装了创建新数组逻辑 - 大量更新且关心性能,可继续用
arraycopy,但务必做边界检查
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











