System.arraycopy是Java高效数组拷贝的底层手段,适用于大数据量、预分配目标数组且类型匹配的场景;小数组用循环更快,需严格校验参数避免运行时异常。

System.arraycopy 是 Java 中真正能扛住高频、大批量数组拷贝的底层手段——它不新建对象、不触发 GC、直接内存搬运,但不是“万能复制键”,用错参数或场景反而更慢。
什么时候该用 arraycopy?看数据量和类型
它快的前提是:数组足够大、类型干净、目标已预分配。
- 基本类型数组(int[]、byte[] 等)拷贝长度 ≥ 256 时,JVM 可启用 SIMD 指令,优势明显
- 对象数组(String[]、MyBean[])也快,只复制引用,不触发 GC 写屏障,适合高吞吐场景
- 长度 ≤ 16 的数组,for 循环常更快——JNI 调用开销盖过了搬运收益
- 目标数组必须提前 new 好,且长度 ≥ destPos + length;否则立刻抛 ArrayIndexOutOfBoundsException
怎么安全截取一段?左闭右开 + 封装校验
按 Java 通用习惯采用 [from, to) 区间,推荐封装成工具方法:
- 先校验:from ≥ 0、to ≤ arr.length、from ≤ to,否则抛 IndexOutOfBoundsException
- 计算长度:int len = to - from
- 创建目标数组:int[] result = new int[len]
- 执行搬运:System.arraycopy(arr, from, result, 0, len)
例如 subArray(new int[]{1,2,3,4,5}, 1, 4) 返回 {2,3,4}。
立即学习“Java免费学习笔记(深入)”;
怎么拼接或原地移动?靠参数控制方向,别手写逻辑
同一数组内移动(如删除后前移、RingBuffer 左移),不用 if 判断方向——JVM 自动选序:
- 左移(destPos
- 右移(destPos > srcPos):System.arraycopy(arr, 2, arr, 5, 5),JVM 自动倒序搬运,防丢数据
- 必须满足:srcPos + length ≤ arr.length 且 destPos + length ≤ arr.length
- 拼接两个数组:目标数组长度设为 a.length + b.length,第二段拷贝的 destPos 是 a.length,不是 0
避坑要点:错一个参数,立刻崩
它不宽容,所有检查都在运行时一次性做,出错即抛异常:
- src 或 dest 为 null → NullPointerException
- srcPos、destPos 或 length 为负 → NegativeArraySizeException 或 IndexOutOfBoundsException
- srcPos + length > src.length 或 destPos + length > dest.length → ArrayIndexOutOfBoundsException
- int[] 拷到 long[]、String[] 拷到 Integer[] → ArrayStoreException(运行时报,编译期不报)
- length = 0 合法,可用于边界预检,不耗性能



















