java合并两个数组并保持原有顺序,核心是按索引依次复制元素,常用arrays.copyof与system.arraycopy高效实现;也可用arraylist中转或stream api,需注意类型一致、空值处理及浅拷贝问题。

Java 中合并两个数组并保持原有顺序,核心是按索引依次将元素放入新数组,不改变各自内部顺序。关键在于明确“保持顺序”指两个数组各自的元素顺序不变,而非整体排序。
使用 Arrays.copyOf 和 System.arraycopy
这是最直接、高效的方式,适合原始类型或对象数组,无需额外依赖。
- 先用 Arrays.copyOf 创建一个足够容纳两数组长度的新数组
- 再用 System.arraycopy 分别把两个数组内容复制过去
示例(合并两个 int 数组):
int[] a = {1, 2, 3};
int[] b = {4, 5, 6, 7};
int[] merged = Arrays.copyOf(a, a.length + b.length);
System.arraycopy(b, 0, merged, a.length, b.length); // 从 a.length 起贴入 b
结果:[1, 2, 3, 4, 5, 6, 7],a 在前、b 在后,各自顺序完整保留。
用 ArrayList 临时中转(适合泛型集合场景)
如果数组类型较复杂(如 String[] 或自定义对象),或后续还需增删操作,可借助 ArrayList 的 addAll 方法,再转回数组。
- 创建 ArrayList,addAll 第一个数组(自动装箱/引用添加)
- 再 addAll 第二个数组
- 调用 toArray() 生成新数组(注意类型擦除,需传入带泛型的数组作为参数)
示例(String[]):
String[] a = {"a", "b"};
String[] b = {"c", "d", "e"};
List<string> list = new ArrayList(Arrays.asList(a));
list.addAll(Arrays.asList(b));
String[] merged = list.toArray(new String[0]);</string>
Stream API 合并(Java 8+,简洁但稍重)
利用 Stream.concat 可读性好,适合函数式风格,但对小数组有轻微开销。
- 将两个数组分别转为 Stream(用 Arrays.stream)
- concat 连接后,用 toArray 收集
示例(整数数组):
int[] a = {1, 2};
int[] b = {3, 4, 5};
int[] merged = Stream.concat(Arrays.stream(a).boxed(),
Arrays.stream(b).boxed())
.mapToInt(Integer::intValue)
.toArray();
注意:原始类型流需 boxed 再 mapToInt,对象类型(如 String)可直接用 Stream.concat(s1, s2).toArray(String[]::new)。
注意事项与避坑点
合并本身简单,但几个细节容易出错:
- 数组类型要一致:不能直接合并 int[] 和 String[],编译不通过
- 空数组安全处理:a 或 b 为 null 时需判空,否则 Arrays.asList(null) 会报 NPE
- 引用类型注意浅拷贝:合并对象数组只是复制引用,原数组元素修改会影响新数组中的对应项
- 性能考量:大量数据优先选 System.arraycopy;少量数据或追求可读性可用 Stream 或 ArrayList 方式
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











