System.arraycopy虽不直接支持插入,但通过先移动后拷贝可实现指定索引插入:先将插入点后元素整体后移,再填入新数据;其核心参数为src、srcPos、dest、destPos、length,支持同数组操作以实现内部平移。

System.arraycopy 本身不直接支持“插入”,但它能高效移动数组元素,配合手动腾出位置,就能实现指定索引处的插入拷贝。关键在于:先将插入点之后的元素整体后移,再把新数据拷贝进去。
理解 arraycopy 的核心参数
调用格式:System.arraycopy(src, srcPos, dest, destPos, length)
- src:源数组(你要拷贝的数据来源)
- srcPos:源数组起始偏移(从第几个元素开始取)
- dest:目标数组(通常是原数组自身,即“就地操作”)
- destPos:目标数组起始偏移(拷到第几个位置)
- length:拷贝多少个元素
注意:src 和 dest 可以是同一个数组,这是实现“内部平移”的前提。
在原数组中插入单个元素(扩容前提)
Java 数组长度固定,插入前必须确保容量足够。常见做法是用 ArrayList 或手动创建更大数组。以下以“扩大的新数组”为例:
- 假设原数组 arr = {1,2,3,4},要在索引 2 处插入元素 99 → 期望结果:{1,2,99,3,4}
- 新建长度 +1 的数组 newArr = new int[arr.length + 1]
- 拷贝插入点前的部分:arraycopy(arr, 0, newArr, 0, 2) → 前两个元素到位
- 写入新元素:newArr[2] = 99
- 拷贝插入点后的剩余部分:arraycopy(arr, 2, newArr, 3, 2) → 把 arr[2..3] 拷到 newArr[3..4]
在原数组中插入多个元素(批量插入)
插入多个值时,逻辑一致,只是需统一计算偏移和长度:
- 原数组 arr = {10,20,30},要在索引 1 插入 {15,16,17} → 目标数组长度需为 6
- 新建 int[] result = new int[6]
- 拷贝前段:arraycopy(arr, 0, result, 0, 1) → [10]
- 拷贝插入数据(若为数组):arraycopy(insertArr, 0, result, 1, 3) → [10,15,16,17]
- 拷贝后段:arraycopy(arr, 1, result, 4, 2) → 补上 [20,30],最终 {10,15,16,17,20,30}
就地操作(不新建数组)的限制与技巧
若坚持复用原数组(如 arr 已预留空间),可用 arraycopy 实现元素“右滑”腾位:
- arr = {1,2,3,4,0,0}(末尾有空位),想在索引 1 插入一个数,需先腾出位置
- 把索引 1 后面的 3 个有效元素(2,3,4)向右挪 1 位:arraycopy(arr, 1, arr, 2, 3)
- 此时 arr 变为 {1,2,2,3,4,0},再给 arr[1] 赋新值即可
- ⚠️ 注意:必须保证目标区域不重叠覆盖未读取数据;当 destPos srcPos 时,需从尾部开始拷贝,否则会覆盖 —— 但 arraycopy 内部已处理该情况,只要 length 不超范围即可安全使用
不复杂但容易忽略:arraycopy 是 native 方法,比循环快得多,尤其适合大数据量迁移;真正难点不在调用本身,而在理清源/目标区间和长度是否越界。动手前画个下标草图,基本不会出错。

















