System.arraycopy()是Java中唯一能直接操作JVM堆内存、绕过Java层循环和边界检查的数组拷贝原语,不创建新数组,只做底层内存块复制,适用于已有数组间高性能数据同步。

System.arraycopy() 是 Java 中唯一能直接操作 JVM 堆内存、绕过 Java 层循环和边界检查的数组拷贝原语,它不创建新数组,只做底层内存块复制(类似 C 的 memcpy),因此是实现两个**已有数组变量间高性能数据同步**的最优选择。
核心前提:目标数组必须已存在且容量足够
arraycopy 不分配内存,只搬运数据。所以:
- 源数组(
src)和目标数组(dest)都必须是非 null 的已初始化数组; -
dest的长度必须 ≥srcPos + length,否则抛ArrayStoreException或IndexOutOfBoundsException; - 两数组类型需兼容(如 int[] → int[]、Object[] → Object[],或子类数组 → 父类数组)。
标准调用格式与关键参数含义
调用签名:
System.arraycopy(src, srcPos, dest, destPos, length);
-
src:源数组引用(不是副本); -
srcPos:从源数组第几个索引开始读(含); -
dest:目标数组引用(必须已存在); -
destPos:向目标数组第几个索引开始写(含); -
length:要拷贝的元素个数(不是字节数,是元素个数)。
例如,把 arrA[2]~arrA[6](共 5 个元素)同步到 arrB[0] 起始位置:System.arraycopy(arrA, 2, arrB, 0, 5);
真正提升性能的关键使用场景
- 同类型数组间整段覆盖:比 for 循环快 2–5 倍,尤其对大数组(>1KB)效果明显;
-
数组“平移”或“内部移动”:如
arraycopy(arr, 1, arr, 0, len-1)实现左移一位(注意:src 和 dest 是同一数组时,JVM 内部会自动处理重叠,按内存地址顺序安全搬运); - 对象数组浅拷贝同步:仅复制引用值,不 clone 对象本身,适合缓存刷新、事件通知队列更新等低开销同步;
- 配合 ArrayList/ArrayDeque 底层扩容迁移:这些集合 add/remove 频繁时,其 grow() 方法内部正是靠 arraycopy 迁移旧元素。
常见误区与安全建议
- 别用它代替
Arrays.copyOf()创建新数组——后者内部虽也调 arraycopy,但封装了 new + copy 两步; - 不要在多线程环境中无同步地让多个线程同时对同一
dest数组调用 arraycopy,可能引发数据撕裂; - 基本类型数组(int[]、byte[])拷贝极快;对象数组拷贝的是引用,速度也快,但后续修改对象内容不会反映在“拷贝”上;
- 若需深拷贝对象数组,请先确保元素实现
Cloneable并手动循环 clone,arraycopy 无法替代。











