Arrays.copyOf 是归并中首选的数组拷贝方法,因其自动处理长度截断或补零、语义清晰、调用简洁;clone 仅支持一维浅拷贝且不可调长,System.arraycopy 需手动指定参数易出错。

Arrays.copyOf 是 Java 中最常用且高效的数组拷贝方法之一,特别适合在归并处理中快速生成新数组、避免手动循环和容量计算错误。
为什么归并时优先选 Arrays.copyOf 而不是 clone 或 System.arraycopy?
clone 只支持一维数组浅拷贝,且无法调整长度;System.arraycopy 需要手动指定源/目标起始位置与长度,易出错;而 Arrays.copyOf 内部已封装 System.arraycopy,自动处理长度截断或补零,语义清晰、调用简洁。
- 归并两个有序数组时,常需构造一个容量为两者之和的新数组,直接用 Arrays.copyOf(arr, newLength) 可一步完成扩容初始化
- 当只需复制前 N 个元素(如归并中途截断),Arrays.copyOf(arr, n) 自动截取,不抛异常
- 对基本类型数组,copyOf 还会自动用 0(int)、false(boolean)等默认值填充新增位置,省去手动初始化
归并两个有序数组:用 copyOf 构建结果容器
以归并两个升序 int 数组为例,核心思路是先用 copyOf 分配好目标数组空间,再双指针填入元素:
- 先调用 int[] merged = Arrays.copyOf(a, a.length + b.length) 创建足够长的数组
- 用两个索引 i、j 分别遍历 a 和 b,将较小值写入 merged[k++]
- 任一数组遍历完后,用 Arrays.copyOfRange 或循环把剩余部分复制过去(也可继续用 copyOf 配合偏移,但通常更推荐 copyOfRange)
注意:不要对 merged 做多次 copyOf,它本身已是新数组,直接写入即可,避免冗余拷贝。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
结合 Arrays.copyOf 实现原地归并优化(小技巧)
若归并目标是“把 b 归并进 a”,且 a 的物理长度 ≥ a.length + b.length(例如 a 是预留空间的数组),可复用 a 的底层数组:
- 先用 Arrays.copyOf(a, a.length + b.length) 得到带扩展空间的新引用
- 然后从后往前双指针归并(避免覆盖未处理元素),这样既复用空间逻辑,又保持代码安全无副作用
- 该技巧常见于 LeetCode “合并有序数组”类题目,比纯新建数组更省内存
避坑提醒:copyOf 的类型擦除与泛型数组
Arrays.copyOf 对泛型 T[] 支持有限——编译期会擦除类型,运行时需传入正确的 Class 类型参数:
- 正确写法:String[] copy = Arrays.copyOf(src, len, String[].class)
- 错误写法:Arrays.copyOf(src, len) 返回 Object[],强转可能触发 ClassCastException
- 归并泛型数组(如 List
转数组后归并)务必显式传 class 参数,否则运行时报错
不复杂但容易忽略。

















