Java合并两个数组最直接的方式是创建新数组,推荐用System.arraycopy(高效原生)、Arrays.copyOf+arraycopy(语义清晰)、Stream(对象数组链式处理)或ArrayList中转(灵活通用)。

Java 中合并两个数组最直接的方式是创建一个新数组,长度为两个原数组长度之和,然后把元素依次复制进去。核心在于“不修改原数组、生成新数组”,不同场景下有不同推荐做法。
用 System.arraycopy(推荐,高效且原生)
这是 JDK 提供的底层高效复制方法,适合所有引用类型和基本类型数组。
- 先计算总长度,new 出目标数组
- 分两次调用
System.arraycopy:第一次复制第一个数组,第二次从指定偏移位置开始复制第二个数组 - 注意参数顺序:
源数组, 起始索引, 目标数组, 目标起始索引, 复制长度
示例(int 数组):
int[] a = {1, 2};int[] b = {3, 4, 5};
int[] merged = new int[a.length + b.length];
System.arraycopy(a, 0, merged, 0, a.length);
System.arraycopy(b, 0, merged, a.length, b.length);
// 结果:[1, 2, 3, 4, 5]
用 Arrays.copyOf 和 Arrays.copyOfRange(语义清晰)
适合想分步构造或强调“扩展+追加”逻辑的场景,可读性好,但内部仍调用 native 方法,性能接近。
立即学习“Java免费学习笔记(深入)”;
-
Arrays.copyOf(arr, newLength)创建原数组的副本并扩容 -
Arrays.copyOfRange(arr, from, to)截取一段再复制 - 把第二个数组的副本,通过
System.arraycopy或循环填入扩大的数组尾部
常用写法(简洁版):
int[] merged = Arrays.copyOf(a, a.length + b.length);System.arraycopy(b, 0, merged, a.length, b.length);
用 Stream(JDK 8+,适合对象数组或需链式处理)
适用于引用类型(如 String[]、Integer[]),代码简洁,支持去重、过滤等后续操作,但有装箱开销和对象创建成本,不建议用于大量基本类型数据。
- 将两个数组转为 Stream,用
Stream.concat()合并 - 再用
toArray()收集为新数组 - 注意:基本类型数组需先包装(如
Arrays.stream(a).boxed()),否则编译不通过
示例(String 数组):
String[] a = {"a", "b"};String[] b = {"c", "d"};
String[] merged = Stream.concat(Arrays.stream(a), Arrays.stream(b))
.toArray(String[]::new);
用 ArrayList 中转(灵活但略重)
适合不确定数组类型、或后续还要增删元素的场景,通用性强,但多一次装箱/复制过程,性能不是最优。
- 新建 ArrayList,addAll 两个数组(需用
Arrays.asList()包装) - 再调用
toArray(new Type[size])得到新数组 - ⚠️ 注意:基本类型数组不能直接用
Arrays.asList()(会变成一个元素),必须先转成包装类数组
示例(Integer[]):
Integer[] a = {1, 2};Integer[] b = {3, 4};
List
list.addAll(Arrays.asList(a));
list.addAll(Arrays.asList(b));
Integer[] merged = list.toArray(new Integer[0]);


















