当前位置:首页 > 后端开发 > 正文

两个数组怎么合并java

Java中,可通过System.arraycopy()、Arrays.copyOf()或手动遍历等方式合并两个数组

Java编程中,合并两个数组是一项常见的操作,适用于多种场景(如数据处理、算法实现等),以下是几种主流的实现方式及其详细解析:

方法名称 适用版本 核心原理 优点 缺点
System.arraycopy() 所有Java版本 通过原生方法高效拷贝元素到目标数组指定位置 性能最优,无需额外依赖 需手动计算长度和索引,代码稍复杂
Arrays.copyOf() + copyOfRange() Java 8+ 利用工具类自动扩展数组容量并分段复制 API简洁易读 底层仍基于System.arraycopy
Stream API (Stream.concat) Java 8+ 函数式风格链式调用,支持并行流处理 代码优雅,可组合其他操作符 类型推断可能导致警告,调试难度较高
List中转法 通用 先将数组转为List集合,再重新转换为新数组 逻辑直观,兼容动态大小变化 涉及装箱/拆箱开销(基本类型尤其明显)
Apache Commons Lang库 需引入第三方包 使用ArrayUtils.addAll()一键完成合并 语法极简,功能稳定 增加外部依赖,不适合轻量级项目

System.arraycopy()——基础且高效的选择

此方法直接操作内存块,适合追求性能的场景,例如合并两个int数组:

int[] arr1 = {1, 2, 3};
int[] arr2 = {4, 5, 6};
int[] result = new int[arr1.length + arr2.length]; // 创建足够大的新数组
System.arraycopy(arr1, 0, result, 0, arr1.length); // 从源数组起始位置复制内容到目标数组的前半部分
System.arraycopy(arr2, 0, result, arr1.length, arr2.length); // 接续复制第二个数组的内容

关键点:

  • 参数说明:srcPos始终为0(从头开始复制);destPos依次偏移前一个数组的长度;length取源数组全长。
  • 泛型支持:可通过反射实现对象类型数组的合并,但需注意类型安全性。

Arrays.copyOf()copyOfRange()组合

Java标准库提供的封装方案更符合面向对象思维,示例如下:

import java.util.Arrays;
...
Integer[] part1 = Arrays.copyOf(arr1, arr1.length); // 完整复制第一个数组
Integer[] combined = Arrays.copyOf(part1, part1.length + arr2.length); // 扩容新数组
System.arraycopy(arr2, 0, combined, part1.length, arr2.length); // 填充剩余空间

若处理原始类型(如int),则需要显式指定组件类型,此方法的优势在于减少手动计算错误的可能性,但本质仍是对System.arraycopy的包装。

Stream API(Java 8+)——函数式编程范式

借助流式处理可以实现声明式的合并逻辑:

import java.util.stream.;
...
int[] merged = Stream.of(arr1, arr2) // 将两个数组视为流的来源
    .flatMapToInt(Arrays::stream)     // 展平为单一整数流
    .toArray();                      // 收集结果到新数组

该方案的优势在于无缝衔接其他中间操作(如过滤、映射),例如需要在合并时跳过某些特定值时尤为便捷,但对于单纯合并需求而言,可能显得“大材小用”。

两个数组怎么合并java  第1张

List作为中介载体

当不局限于数组结构时,可借助集合框架灵活性:

List<Integer> list = new ArrayList<>();
Collections.addAll(list, arr1); // 添加第一个数组的所有元素
Collections.addAll(list, arr2); // 追加第二个数组的元素
Object[] combined = list.toArray(); // 转换为Object数组或指定具体类型

注意:如果原始数组是基本类型(如int[]),必须先转换为对应的包装类(Integer[]),否则会自动装箱导致性能下降,最终得到的可能是Object[]而非预期的具体类型数组,需要进行类型转换。

Apache Commons Lang工具库

在允许使用第三方库的情况下,推荐使用经过充分测试的工具方法:

import org.apache.commons.lang3.ArrayUtils;
...
int[] finalResult = ArrayUtils.addAll(arr1, arr2); // 一行代码完成合并

此实现内部已优化边界条件处理(如空输入、多维数组等情况),适合企业级应用快速开发,不过需要注意许可证兼容性问题。

特殊考量因素对比表

维度 System.arraycopy Stream API List中转法 Commons Lang
执行速度
代码简洁度
内存占用 最低 较高(流模型) 中等(临时对象) 略高于标准库
异常处理能力 无自动校验 可选try-catch 隐式NullPointerException 完善的空指针保护
兼容性 全版本支持 Java 8+ 全版本支持 需引入依赖

典型错误示例与修正建议

误区1:直接使用加号运算符拼接数组

部分初学者误认为类似字符串连接的方式适用于数组:int[] wrong = arr1 + arr2;,实际上这会导致编译错误,因为Java不支持数组间的算术运算,必须显式调用API完成合并。

误区2:忽略类型匹配问题

尝试合并不同类型数组(如int[]和String[])时会引发ClassCastException,解决方案是确保参与合并的数组具有相同的组件类型,必要时进行显式类型转换。

最佳实践推荐

对于大多数常规场景,建议优先采用System.arraycopy()方案,因其在性能和可控性之间取得最佳平衡,若项目已集成Stream生态或需要链式调用,则可选择流式写法提升可读性,而在团队规范允许的情况下,使用Apache Commons Lang能显著提高开发效率。


相关问答FAQs

Q1: 如果其中一个数组为空怎么办?会影响合并结果吗?
A: 不会受到影响,所有上述方法均能正确处理空数组情况,例如当arr2为空时,合并后的数组将仅包含arr1的元素,特别地,System.arraycopy()在此情况下不会执行任何实际拷贝操作,从而避免无效计算。

Q2: 能否合并不同类型的数组?(如int[]和double[]混合)
A: 不能直接合并,由于Java是强类型语言,不同类型数组的元素无法存入同一个数值型数组中,可行的替代方案包括:①统一转换为Object数组;②先进行类型转换使两组数据保持一致(如全部转为double类型),需要注意的是,这种转换可能导致精度损失(如将int强制提升

0