System.arraycopy 是 Java 中最高效、最底层的数组拷贝方式,直接调用 JVM 本地方法,绕过 Java 方法调用开销和部分边界检查,比 Arrays.copyOf、clone() 和 for 循环更快,尤其适用于大数组或高频拷贝场景。

System.arraycopy 是 Java 中最高效、最底层的数组拷贝方式,它直接调用 JVM 的本地方法(Native),绕过普通 Java 方法调用开销和边界检查(在 JIT 优化后甚至可消除部分检查),比 Arrays.copyOf、clone() 或手动 for 循环快得多——尤其在大数组或高频拷贝场景下优势明显。
核心参数含义与顺序不能错
调用格式为:
System.arraycopy(src, srcPos, dest, destPos, length)
-
src:源数组(不能为空,否则抛
NullPointerException) -
srcPos:从源数组哪个索引开始读(含),必须满足
0 ≤ srcPos ≤ src.length -
dest:目标数组(不能为空,且类型需与 src 兼容,否则抛
ArrayStoreException) -
destPos:向目标数组哪个索引开始写(含),必须满足
0 ≤ destPos ≤ dest.length -
length:要拷贝多少个元素,必须 ≥ 0;且需满足
srcPos + length ≤ src.length且destPos + length ≤ dest.length,否则抛ArrayIndexOutOfBoundsException
常见高效用法场景
不依赖额外对象分配,适合性能敏感环节:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
扩容并迁移数据:比如 ArrayList 的 grow() 内部就是用
arraycopy把旧数组内容快速复制到新数组 -
截取子数组:比
Arrays.copyOfRange少一次数组创建(若目标数组已存在)
例如:把 arr[2] 到 arr[6](共5个)拷入已分配好的 sub[0] 开始位置 →arraycopy(arr, 2, sub, 0, 5) -
数组内移动(如左移/右移):当
src == dest时,支持重叠区域拷贝,JVM 自动按方向处理避免覆盖
例如:将 arr[0..n-2] 左移一位覆盖 arr[1..n-1] →arraycopy(arr, 0, arr, 1, n-1)
避坑要点:类型、空值与越界
- 源和目标数组必须是**兼容类型**:如
Object[]可拷入String[]?不行!会抛ArrayStoreException;但String[]拷入Object[]可以(协变) - **不校验元素是否为 null**:只做引用拷贝(对对象数组)或值拷贝(对基本类型),null 值照常复制
- 所有索引和长度检查在运行时执行,建议在非可信输入场景下先做预校验,避免线上抛异常中断流程
- 没有返回值!它是「就地」操作,别试图接返回值(编译都不过)
对比其他拷贝方式的实测提示
小数组(arraycopy 通常比 for 循环快 2–5 倍,比 Arrays.copyOf 快 1.2–1.8 倍(后者内部其实也调了 arraycopy,但多了一次 new 数组开销)。
真正提升效率的关键不是“用了 arraycopy”,而是:提前复用目标数组、避免重复 new、利用其重叠拷贝能力减少临时空间 —— 这些才是实战中拉开差距的地方。
立即学习“Java免费学习笔记(深入)”;

















