system.arraycopy 通过复用数组和绕过封装实现比 arrays.copyof 更快的截取,其 native 实现、无装箱开销、支持高效内存拷贝,适用于高性能场景;使用时需注意类型匹配、边界检查及 null 安全。

System.arraycopy 是 Java 中用于高效复制数组的底层方法,它本身不直接“截取”数组,但配合新数组创建,能实现比 Arrays.copyOf 或流式操作更轻量的截取效果——尤其适合对性能敏感或大量重复操作的场景。
为什么用 arraycopy 截取比 Arrays.copyOf 更快?
Arrays.copyOf 内部其实就调用了 System.arraycopy,但它多了一层封装:先 new 一个目标数组,再复制。而直接使用 arraycopy,你可以复用已有数组、控制起始位置和长度,避免冗余对象创建和边界检查开销。
- arraycopy 是 native 方法,JVM 层面优化,内存连续拷贝效率极高
- 不触发泛型擦除相关逻辑,原始类型数组(如 int[])无装箱开销
- 适合在循环中反复截取不同段(例如分页读取缓冲区),只需重用目标数组
标准截取写法:从源数组提取一段到新数组
要截取 int[] arr 的 [from, to) 区间(左闭右开),需手动 new 目标数组,再调用 arraycopy:
int[] src = {1, 2, 3, 4, 5, 6};
int from = 2, to = 5; // 截取索引 2~4 → {3, 4, 5}
int[] dest = new int[to - from];
System.arraycopy(src, from, dest, 0, dest.length);
关键参数顺序别记错:源数组、源起点、目标数组、目标起点、复制长度。越界会抛 IndexOutOfBoundsException,务必确保 from ≥ 0、to ≤ src.length、from ≤ to。
进阶技巧:复用目标数组避免频繁分配
若需多次截取固定长度片段(如解析网络包、处理音频帧),可提前分配一个足够大的目标数组,每次只更新有效长度:
- 声明 long[] buffer = new long[1024]; 作为通用接收区
- 每次调用 System.arraycopy(src, offset, buffer, 0, len) 填充前 len 个位置
- 后续逻辑只处理 buffer[0] 到 buffer[len-1],无需新建数组
这种模式在 Netty、Lucene 等高性能库中很常见,能显著降低 GC 压力。
注意边界与类型安全
arraycopy 不做类型转换,源和目标数组必须是兼容类型:
- int[] → int[] ✅,int[] → long[] ❌(会抛 ArrayStoreException)
- Object[] 可以复制子类数组(如 String[] → Object[]),但反向不行
- 截取字符串内部 char[] 时,别直接操作 —— String 是不可变的,应通过 substring 或 toCharArray()
另外,null 检查要自己做,arraycopy 对 null 源或目标数组直接抛 NullPointerException。











