system.arraycopy本身不支持插入,需先右移元素腾出空间再复制新元素;在原数组插入需确保容量足够,否则须创建新数组分三步拼接。

System.arraycopy 本身不直接支持“插入”操作,它只是高效地复制一段内存数据。要在数组中实现元素批量插入,本质是:先腾出插入位置后的空间(右移已有元素),再把新元素填进去。整个过程需手动控制偏移和长度,不能一步到位。
理解 arraycopy 的参数含义
调用形式:System.arraycopy(src, srcPos, dest, destPos, length)
- src:源数组(你要复制的数据来源)
- srcPos:源数组起始索引(通常为 0,若复制新元素则从头开始)
- dest:目标数组(通常是原数组本身)
- destPos:目标数组写入起始位置(即插入点)
- length:复制元素个数(关键:决定腾多少空间)
在原数组中插入一批元素(扩容前提下)
Java 数组长度固定,所以“插入”必须基于一个**足够大的新数组**,或提前确保原数组有冗余空间。常见做法是创建新数组:
- 假设原数组
arr长度为n,要在索引index处插入newElements(长度为k) - 新建数组
newArr = new Type[n + k] - 用三次
arraycopy拼接:- 复制
arr[0..index-1]到newArr[0] - 复制
newElements到newArr[index] - 复制
arr[index..n-1]到newArr[index + k]
- 复制
在已有冗余空间的数组中就地插入(不新建数组)
适用于如 ArrayList 内部数组、或你自己维护的带容量的数组。前提是 arr.length >= originalLength + k:
- 先将原数组中插入点之后的元素整体右移
k位:System.arraycopy(arr, index, arr, index + k, originalLength - index); - 再把新元素拷贝进来:
System.arraycopy(newElements, 0, arr, index, k); - 注意:右移时源和目标都是同一数组,必须保证不覆盖——所以要从后往前移(
arraycopy内部已处理重叠逻辑,只要destPos > srcPos就安全)
实际示例:向 int[] 插入三个数
在 int[] arr = {1, 2, 3, 4, 5} 索引 2 处插入 {7, 8, 9}:
int[] arr = {1, 2, 3, 4, 5};
int[] toInsert = {7, 8, 9};
int insertIndex = 2;
<p>// 创建新数组
int[] newArr = new int[arr.length + toInsert.length];
// 复制前段 [0,2)
System.arraycopy(arr, 0, newArr, 0, insertIndex);
// 复制新元素
System.arraycopy(toInsert, 0, newArr, insertIndex, toInsert.length);
// 复制后段 [2,5)
System.arraycopy(arr, insertIndex, newArr, insertIndex + toInsert.length, arr.length - insertIndex);</p><p>// newArr = {1, 2, 7, 8, 9, 3, 4, 5}
</p>
不复杂但容易忽略:arraycopy 是 native 实现的高性能操作,比 for 循环快得多;但它不做越界检查以外的任何逻辑——插入位置是否合法、空间是否足够,都得你来保障。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











