System.arraycopy 是 JVM 内置的高效数组拷贝方法,直接调用本地内存复制指令,不创建新数组、无逐元素 Java 调用开销,支持重叠拷贝与 CPU 批量指令优化。

System.arraycopy 是 Java 中最高效、最底层的数组拷贝方式,它直接调用 JVM 的本地方法(通常由 C/C++ 实现),绕过 Java 层的循环和边界检查开销,性能远超 Arrays.copyOf 或手动 for 循环。
为什么 arraycopy 比其他方式快
它不是 Java 方法,而是 JVM 内置的原子操作:
- 不创建新数组对象(需提前分配目标数组)
- 不进行逐元素的 Java 方法调用或类型检查(在同类型数组间拷贝时)
- 支持内存块级复制(类似 C 的
memcpy),可利用 CPU 的批量加载/存储指令 - JIT 编译器可能进一步内联或向量化优化
基本用法与参数含义
签名:public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
- src:源数组(不能为空)
- srcPos:源数组起始索引(>= 0,且
- dest:目标数组(不能为空,且类型需与 src 兼容)
- destPos:目标数组起始索引(>= 0,且
- length:要拷贝的元素个数(>= 0,且不能导致越界)
⚠️ 注意:运行时若发生类型不匹配(如把 String[] 拷进 Integer[])、空指针或越界,会抛出 ArrayStoreException、NullPointerException 或 IndexOutOfBoundsException。
典型高性能使用场景
-
动态扩容数组:ArrayList 的
ensureCapacity内部就用它迁移旧元素 -
截取子数组:比
Arrays.copyOfRange少一次 new 数组操作(后者内部也调用 arraycopy) - 合并数组:先拷 src1 到 dest,再拷 src2 到 dest 后续位置
- 移动数组内片段:比如删除中间元素后,把后段前移——此时 src 和 dest 是同一数组,arraycopy 能安全处理重叠区域(正向/反向自动选择)
示例:把 int 数组后半部分前移两位
立即学习“Java免费学习笔记(深入)”;
int[] arr = {1, 2, 3, 4, 5, 6};
// 把索引2~5的元素(3,4,5,6)拷到索引0~3
System.arraycopy(arr, 2, arr, 0, 4); // 结果:[3, 4, 5, 6, 5, 6]
关键注意事项
- 目标数组必须已存在且足够大,否则抛
IndexOutOfBoundsException - 不支持跨维数组(如二维数组需逐行拷贝)
- 原始类型数组和引用类型数组都支持,但 src 和 dest 类型必须兼容(如 Object[] 可接收 String[],反之不行)
- 对 null 元素不做特殊处理,原样拷贝引用值
- 不是线程安全的“原子操作”——若多线程同时读写同一数组区域,仍需同步



















