system.arraycopy是java中最底层高效的数组拷贝方式,直接调用jvm本地方法(如memmove/memcpy),绕过java层循环与边界检查,支持重叠安全复制,但要求参数严格合法,否则抛出相应运行时异常。

System.arraycopy 是 Java 中底层最高效的数组拷贝方式,它直接调用 JVM 的本地方法(通常是 C/C++ 实现),绕过 Java 层的循环和边界检查开销,比手动 for 循环或 Arrays.copyOf 更快、更轻量,特别适合在算法中频繁、精准地搬运数据片段。
明确用途:不是通用复制,而是“内存块搬运”
它不创建新数组,只把源数组某段内容“搬”到目标数组某段位置。必须确保目标数组已存在且空间足够,否则抛 ArrayStoreException 或 IndexOutOfBoundsException。算法中常见于:
- 归并排序的合并阶段(把左右子数组有序内容复制进临时缓冲区)
- 滑动窗口扩容时迁移有效数据
- 双端队列/动态数组的元素平移(如删除首元素后整体前移)
关键参数要一次写对
签名:System.arraycopy(src, srcPos, dest, destPos, length)
-
src 和 dest 可以是同一数组(实现内部平移),但需注意重叠处理方向:左移用
srcPos 会出错,此时应从尾部倒序搬;右移同理 -
length 是实际拷贝元素个数,不是下标范围;
srcPos + length 且 <code>destPos + length 必须成立 - 所有位置参数(
srcPos,destPos,length)必须 ≥ 0
和 Arrays.copyOf 对比:什么场景选哪个?
如果算法需要“复制并扩容”,比如快速排序中分割后新建子数组,用 Arrays.copyOfRange(arr, from, to) 更简洁安全;但如果已在循环内反复操作固定大小的临时数组(如归并排序的 aux 数组),直接用 arraycopy 避免重复 new 数组对象,减少 GC 压力。
例如归并中的典型写法:
// 假设 aux 已预先分配好,大小等于原数组 System.arraycopy(a, lo, aux, lo, mid - lo + 1); // 拷贝左半段 System.arraycopy(a, mid+1, aux, mid+1, hi - mid); // 拷贝右半段
性能提示:别为小数组过度优化
当 length ≤ 16 左右时,JVM 可能自动内联为机器码循环,arraycopy 优势不明显;真正受益的是中大数组(≥ 几百元素)或高频调用路径。可配合 JMH 基准测试验证,避免过早优化。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











