system.arraycopy 是 java 中高效复制数组元素的底层方法,不创建新对象、不触发 gc、不进行运行时类型检查,适用于合并多个数组的高性能场景,但需手动计算偏移量、预分配目标数组并分段调用。

System.arraycopy 是 Java 中高效复制数组元素的底层方法,它不创建新对象、不触发 GC、不进行类型检查(运行时),适合在合并多个数组时追求性能的场景。但要注意:它不能直接合并任意数量的数组,需手动计算偏移量并分段复制。
明确目标数组长度,提前分配空间
合并前必须知道最终数组总长度,否则无法创建目标数组。比如合并三个 int 数组:a(长度 2)、b(长度 3)、c(长度 4),目标数组长度就是 2 + 3 + 4 = 9。
- 用
int[] result = new int[a.length + b.length + c.length];预分配 - 避免在循环中反复扩容或拼接,那会退化为低效操作
- 如果数组来源是集合或不确定长度,先遍历一次统计总长,再分配
按顺序分段复制,控制好 srcPos 和 destPos
每次调用 System.arraycopy 需指定源数组、起始位置、目标数组、插入位置和复制长度。关键在于目标位置(destPos)要累加前序已复制的长度。
- 复制
a:从result[0]开始 →arraycopy(a, 0, result, 0, a.length) - 复制
b:从result[a.length]开始 →arraycopy(b, 0, result, a.length, b.length) - 复制
c:从result[a.length + b.length]开始 →arraycopy(c, 0, result, a.length + b.length, c.length)
处理不同类型数组需分别实现
System.arraycopy 是泛型擦除后的原生支持,对基本类型和引用类型都有效,但不能跨类型混用(如把 String[] 复制到 Object[] 需确保目标类型兼容)。
- 同为
String[]:可直接复制,目标数组也必须是String[] - 想合并成
Object[]:目标数组声明为Object[],源数组元素自动向上转型 - 基本类型数组(如
int[])不能复制到Integer[],这是类型不匹配,会抛ArrayStoreException
封装成工具方法提升复用性
重复写多段 arraycopy 易出错,建议封装为静态方法,支持可变参数:
- 方法签名可设为
public static <t> T[] concat(T[]... arrays)</t>(适用于引用类型) - 基本类型需单独重载,如
concat(int[] a, int[] b, int[] c) - 内部仍用
System.arraycopy分段复制,只是把偏移计算逻辑收拢 - 注意空数组判断,避免
null引发NullPointerException











