system.arraycopy不能直接插入,因为它仅执行固定区间的内存拷贝,不自动扩容或移动元素;插入需先腾出空间,再分段复制前后部分并赋值新元素。

System.arraycopy 本身不直接支持插入操作,它只是高效复制数组片段;要实现插入,需先腾出空间再复制。
为什么 arraycopy 不能直接插入
System.arraycopy 是底层内存拷贝工具,只做“从源数组某位置开始、复制指定长度、放到目标数组某位置”的搬运工作。它不会自动扩容数组或移动元素——插入需要把原数组中插入点之后的元素整体后移,这得靠开发者手动安排两次复制来完成。
插入单个元素的典型步骤
假设在数组 arr 的索引 index 处插入新元素 value:
- 确认数组有足够容量(否则需新建更大数组)
- 用 arraycopy 将 arr[index] 到末尾的元素整体后移一位(即复制到 index + 1 开始的位置)
- 把 value 赋值给 arr[index]
示例代码:
int[] arr = {1, 2, 3, 4};
int index = 2; // 在索引 2 处插入(即插在 3 前面)
int value = 99;
// 扩容:创建新数组,长度 +1
int[] newArr = new int[arr.length + 1];
// 复制前半段:[0, index)
System.arraycopy(arr, 0, newArr, 0, index);
// 复制后半段:从 arr[index] 开始,复制到 newArr[index+1]
System.arraycopy(arr, index, newArr, index + 1, arr.length - index);
// 插入新值
newArr[index] = value;
// 此时 newArr = {1, 2, 99, 3, 4}
插入多个元素或批量插入
逻辑类似,但要注意偏移量和长度计算:
- 目标数组长度需增加插入元素个数
- 后移部分长度 = 原数组长度 − 插入位置
- 后移目标起始位置 = 插入位置 + 插入元素个数
例如在索引 1 插入 {5, 6, 7} 到 {1,2,3,4} 中,新数组长为 7,需将原数组索引 1 后的 3 个元素(2,3,4)复制到新数组索引 4 开始处。
实际使用中的关键提醒
arraycopy 插入本质是“模拟动态数组行为”,但 Java 原生数组不可变长,所以每次插入都涉及新数组分配和数据搬迁——性能随插入频次下降明显。
- 频繁插入建议改用 ArrayList(内部已封装了 arraycopy 逻辑)
- 若坚持用原生数组,可预估容量减少扩容次数
- 注意边界:index 原数组长度会抛 IndexOutOfBoundsException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











