使用System.arraycopy合并数组需注意:先创建长度为目标数组之和的数组,确保类型一致且非空;两次拷贝的destPos和length需正确,避免数据覆盖。当拷贝长度≤16时,手动赋值更快;对象数组仅复制引用,需深拷贝需额外处理。
用 System.arraycopy 合并数组,听起来是件挺简单的事儿——两行代码搞定。但真正落到工程里,你会发现它远不是“无脑调用”就行的。它背后是直接操作内存的本地方法调用,用对了性能翻倍,用错了可能比手写循环还慢。下面就把几个关键点和坑都说清楚。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
很多人拿到数组就写两行 arraycopy,结果运行时不是抛 ArrayIndexOutOfBoundsException 就是数据错位。在真正搬运数据之前,下面三个步骤一个都不能省:
arr1.length + arr2.length,少一个元素都不行,直接抛异常。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 为空时又会出问题。System.arraycopy 快是有前提的。实测数据显示,当拷贝长度 ≤ 16 个元素时,JNI 调用的开销往往比简单赋值还要高,这时候它反而更慢:
result[0] = a[0]; result[1] = a[1]; ... 更稳妥也更快。arraycopy,但别指望有性能收益。arraycopy 的优势开始真正显现,数组越大差距越明显——百万级数组可以快 3 到 5 倍。System.arraycopy 对于对象数组,只复制引用,不做深拷贝。这意味着:
result[i] 和原来的 arr1[i] 指向的是同一个对象实例。arraycopy 之后遍历数组,调用 clone()(前提是对象实现了 Cloneable),或者用序列化工具重建一份完整的副本。侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述