System.arraycopy拼接数组核心是算准总长、分段搬运、类型对齐;需预分配目标数组,手动累加偏移量,仅适用于已知长度的大数组场景,小数据(<256)反不如循环高效。
用 System.arraycopy 拼接数组,核心不是“调一次就完事”,而是“算准长度、分段搬运、类型对齐”。它不自动扩容、不智能拼接,但胜在零对象创建、无GC压力、接近内存拷贝速度——尤其适合已知总长、需极致性能的大数组合并场景。
拼接前必须明确最终容量,否则无法启动。例如合并三个 int[]:a(长度512)、b(长度1024)、c(长度2048),目标数组长度就是 512 + 1024 + 2048 = 3584。
int[] result = new int[a.length + b.length + c.length],一步到位String[] 可直接拼;想存进 Object[],目标数组就得声明为 Object[],且所有源数组元素能向上转型每次 arraycopy 只搬一段,下一段的起始位置由前序累计长度决定。错写成固定 0 就会覆盖,写小了会越界。
System.arraycopy(a, 0, result, 0, a.length)
System.arraycopy(b, 0, result, a.length, b.length)
System.arraycopy(c, 0, result, a.length + b.length, c.length)
int pos = 0,每复制完一段就执行 pos += arr.length
手动写多行 arraycopy 易出错,尤其数组数量增加时。封装后可统一处理 null、空数组和边界校验。
public static String[] concat(String[]... arrays)
arrays[i] 是否为 null,是则抛 IllegalArgumentException 或跳过(按需)length == 0)不做任何操作,不影响后续逻辑pos + currentArr.length <= result.length,确保不会越界System.arraycopy 的底层是 JVM 调用 memmove 或 SIMD 指令,但 JNI 调用本身有开销。实测表明,拷贝长度低于 256 时,简单 for 循环可能更快。
if (length > 256) { System.arraycopy(...) } else { for (...) }
byte[]、int[])性能最优;引用类型只拷地址,速度快但属浅拷贝arraycopy 同时往一个 dest 写不同区域