一维数组归并指将两个已排序数组合并为有序数组,采用双指针法逐个比较填入;合并则指非排序下拼接多个数组,常用system.arraycopy或arraylist实现,需校验null和空数组。

一维数组的归并与合并,核心在于将两个已排序数组合并成一个有序数组,或把多个数组按逻辑拼接为一个新数组。关键不是简单复制,而是保持顺序、避免越界、合理分配空间。
归并两个有序数组
归并常用于归并排序的最后一步,要求输入数组各自有序,输出也保持升序。典型做法是双指针从头开始比较,逐个取较小值填入新数组。
- 准备三个索引:i(数组1)、j(数组2)、k(结果数组),初始都为0
- 比较 arr1[i] 和 arr2[j],较小者放入 result[k],对应索引和 k 同时加1
- 某一方遍历完后,把另一方剩余元素直接复制过去(无需再比较)
- 注意:结果数组长度必须为 arr1.length + arr2.length,提前分配好空间
合并多个数组(非排序场景)
如果只是把几个一维数组连成一个,不强调排序,重点在内存管理和元素迁移。推荐用 System.arraycopy 或增强 for 循环,避免手动下标出错。
- 先计算总长度,创建目标数组:int[] merged = new int[len1 + len2 + len3]
- 用 System.arraycopy 分段复制:比如 System.arraycopy(arr1, 0, merged, 0, arr1.length)
- 后续数组起始位置按已填长度累加,如 arr2 复制到 merged[arr1.length]
- 也可用 ArrayList
先收集所有元素,再转为数组,适合类型不确定或长度动态场景
边界与异常处理要点
实际编码中容易忽略空数组、null 引用、数据类型不一致等问题,导致运行时异常。
- 开头检查每个输入数组是否为 null,空数组(length == 0)可直接跳过处理
- 若涉及基本类型(如 int[]),不能直接用 Arrays.asList() 转 List,会变成装箱问题
- 合并字符串数组时,注意 null 元素调用 toString() 会抛 NullPointerException
- 建议封装成工具方法,参数校验放在最前,提高复用性和健壮性
一个简洁可用的归并示例
以下代码片段实现两个升序 int 数组的归并,无第三方依赖,可直接运行验证:
public static int[] mergeSorted(int[] a, int[] b) {
if (a == null) return b == null ? new int[0] : b.clone();
if (b == null) return a.clone();
int[] res = new int[a.length + b.length];
int i = 0, j = 0, k = 0;
while (i
不复杂但容易忽略细节,写对不难,写稳需要多想一层边界。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











