System.arraycopy合并数组需先创建目标数组、确认类型一致、校验源数组非null;两次拷贝参数须精准,小数组(≤16)手动赋值更优,对象数组仅复制引用。
用 System.arraycopy 合并数组本身不难,真正影响性能的是怎么用、在哪用、用之前做什么——它不是“开箱即用”的语法糖,而是直连内存的搬运指令,用对了快几倍,用错了可能比循环还慢。
很多人一上来就写两行 arraycopy,结果运行时报错或数据错乱。真正落地前,这三步不能跳:
arr1.length + arr2.length,少一个元素就抛 ArrayIndexOutOfBoundsException
int[] 和 long[] 不兼容,String[] 可以拷到 Object[],但反过来不行;编译不报错,运行时才炸null 直接抛 NullPointerException,建议合并前加空判断,而不是靠异常兜底合并本质是两段内存搬运,第二段的起始位置决定拼接是否正确:
System.arraycopy(arr1, 0, result, 0, arr1.length)
System.arraycopy(arr2, 0, result, arr1.length, arr2.length) —— 这里的 arr1.length 是关键,不是 0,也不是 arr2.length
destPos 写成 0,导致 arr2 覆盖 arr1 的数据;或写成 result.length - arr2.length,在 arr1 为空时出错它快是有条件的。实测表明,当拷贝长度 ≤ 16 时,JNI 调用开销常超过简单赋值,反而更慢:
result[0] = a[0]; result[1] = a[1]; ... 更稳更快arraycopy,但别指望收益arraycopy 优势开始明显,越大越显著(百万级数组可快 3–5 倍)System.arraycopy 对对象数组只复制引用,不深拷贝:
result[i] 和原 arr1[i] 指向同一个对象实例arraycopy 后遍历调用 clone()(要求实现 Cloneable),或用序列化工具重建