system.arraycopy 是 java 中最底层、最高效的数组复制方式,直接调用 jvm 本地方法,绕过 java 层循环与边界检查,比 arrays.copyof 和手动循环更快,尤其适合大数组或高频复制场景。

System.arraycopy 是 Java 中最底层、最高效的数组复制方式,它直接调用 JVM 的本地方法(C/C++ 实现),绕过 Java 层的循环和边界检查开销,比 Arrays.copyOf 或手动 for 循环快得多,尤其适合大数组或高频复制场景。
核心参数必须对齐
调用格式:System.arraycopy(src, srcPos, dest, destPos, length)。五个参数一个都不能错位:
- src 和 dest 类型必须兼容(如 int[] → int[],Object[] → Object[];子类数组可复制给父类数组,但不能反向)
-
srcPos + length ≤ src.length,否则抛
ArrayIndexOutOfBoundsException - destPos + length ≤ dest.length,目标空间不足也会报错
- length 不能为负数,哪怕 src/dest 是 null,只要 length=0 就安全(JVM 特殊处理)
避免常见坑:null 和类型擦除
泛型数组(如 List<string>[]</string>)本质是 Object[],但编译后类型信息丢失。若误将 String[] 当作 Object[] 传入,运行时可能 ClassCastException:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 错误写法:
String[] s = {"a"}; Object[] o = new Object[1]; System.arraycopy(s, 0, o, 0, 1);→ 成功(因为 String 是 Object 子类) - 危险写法:
Object[] o = {"a"}; String[] s = new String[1]; System.arraycopy(o, 0, s, 0, 1);→ 运行时报ArrayStoreException(Object[] 元素不一定是 String) - 建议:复制前用
src.getClass().getComponentType()和dest.getClass().getComponentType()检查是否可赋值
比 Arrays.copyOf 更可控的扩容/截断
Arrays.copyOf 内部其实就调用了 System.arraycopy,但封装了新数组创建逻辑。如果你需要复用已有数组、只复制部分数据,或做“原地迁移”,arraycopy 更灵活:
- 扩容合并:
int[] old = {1,2}; int[] newBuf = new int[5]; System.arraycopy(old, 0, newBuf, 0, old.length);(后面元素保持 0) - 左移删除首元素:
System.arraycopy(arr, 1, arr, 0, arr.length-1);(适用于模拟队列出队) - 高效截断:
int[] trimmed = new int[3]; System.arraycopy(src, 2, trimmed, 0, 3);(跳过前两个,取后续三个)
性能关键:别在小数组上过度优化
对于长度 arraycopy 差距几乎为零,甚至因 JNI 调用开销略慢。真正收益出现在:
- 数组长度 ≥ 1000
- 频繁调用(如网络包解析、图像像素批量处理)
- 多线程环境下,避免 synchronized 的
clone()方法竞争
实际压测中,百万级 int[] 复制,arraycopy 比 for 循环快 3~5 倍,比 clone() 快 1.5 倍左右。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










