当前位置: 首页 > backend >正文

数组合并方式

在 Java 中,数组合并的方式有多种,具体取决于数组类型(基本类型数组或对象数组)、JDK 版本(是否支持 Stream API)以及是否需要修改原数组。以下是常见的实现方式:

一、基本类型数组(如 int[])合并

1. 使用 System.arraycopy()

这是最基础的方法,通过手动创建新数组并复制元素实现。

int[] arr1 = {1, 2, 3};
int[] arr2 = {4, 5, 6};// 创建新数组,长度为两个原数组之和
int[] merged = new int[arr1.length + arr2.length];// 复制第一个数组到新数组的前半部分
System.arraycopy(arr1, 0, merged, 0, arr1.length);
// 复制第二个数组到新数组的后半部分
System.arraycopy(arr2, 0, merged, arr1.length, arr2.length);// 输出:[1, 2, 3, 4, 5, 6]
System.out.println(Arrays.toString(merged));
2. Java 8+:使用 IntStream.concat()(基本类型专用)

利用 Stream API 合并两个 IntStream,再转换为数组。

import java.util.stream.IntStream;int[] merged = IntStream.concat(IntStream.of(arr1),  // 将 arr1 转为 IntStreamIntStream.of(arr2)   // 将 arr2 转为 IntStream
).toArray();             // 转换回数组

二、对象数组(如 String[])合并

1. 使用 System.arraycopy()(同基本类型)
String[] arr1 = {"a", "b"};
String[] arr2 = {"c", "d"};String[] merged = new String[arr1.length + arr2.length];
System.arraycopy(arr1, 0, merged, 0, arr1.length);
System.arraycopy(arr2, 0, merged, arr1.length, arr2.length);// 输出:[a, b, c, d]
System.out.println(Arrays.toString(merged));
2. Java 8+:使用 Stream.concat()(通用方式)

通过 Stream.concat() 合并两个数组的 Stream。

import java.util.stream.Stream;String[] merged = Stream.concat(Arrays.stream(arr1),  // 将 arr1 转为 Stream<String>Arrays.stream(arr2)   // 将 arr2 转为 Stream<String>
).toArray(String[]::new);  // 收集为 String[]

三、多维数组(如 int[][])合并

多维数组的合并通常指合并外层数组(例如将两个二维数组的“行”合并)。

int[][] arr1 = {{1, 2}, {3, 4}};
int[][] arr2 = {{5, 6}, {7, 8}};// 创建新的二维数组,行数为两个原数组之和
int[][] merged = new int[arr1.length + arr2.length][];// 复制外层数组
System.arraycopy(arr1, 0, merged, 0, arr1.length);
System.arraycopy(arr2, 0, merged, arr1.length, arr2.length);// 输出:[[1, 2], [3, 4], [5, 6], [7, 8]]
System.out.println(Arrays.deepToString(merged));

四、合并并去重(需要手动处理)

若合并后需要去重,可结合 Set 实现(仅适用于对象数组,基本类型数组需先装箱)。

String[] arr1 = {"a", "b", "c"};
String[] arr2 = {"b", "c", "d"};// 使用 LinkedHashSet 保持插入顺序并去重
Set<String> set = new LinkedHashSet<>();
Collections.addAll(set, arr1);  // 添加 arr1 元素
Collections.addAll(set, arr2);  // 添加 arr2 元素(重复元素自动忽略)String[] merged = set.toArray(new String[0]);  // 转换回数组// 输出:[a, b, c, d]
System.out.println(Arrays.toString(merged));

五、工具类封装(简化重复操作)

为避免每次合并都编写冗长代码,可封装成工具方法:

public class ArrayUtils {// 合并两个 int[]public static int[] merge(int[] arr1, int[] arr2) {return IntStream.concat(IntStream.of(arr1), IntStream.of(arr2)).toArray();}// 合并两个 String[]public static String[] merge(String[] arr1, String[] arr2) {return Stream.concat(Arrays.stream(arr1), Arrays.stream(arr2)).toArray(String[]::new);}// 合并任意类型数组(泛型方法)@SafeVarargspublic static <T> T[] merge(T[]... arrays) {int totalLength = 0;for (T[] array : arrays) {totalLength += array.length;}// 创建新数组(需通过反射,因 Java 泛型擦除)T[] result = (T[]) Array.newInstance(arrays[0].getClass().getComponentType(), totalLength);int destPos = 0;for (T[] array : arrays) {System.arraycopy(array, 0, result, destPos, array.length);destPos += array.length;}return result;}
}

使用示例

int[] mergedInts = ArrayUtils.merge(new int[]{1, 2}, new int[]{3, 4});
String[] mergedStrings = ArrayUtils.merge(new String[]{"a"}, new String[]{"b", "c"});

六、注意事项

  1. 性能考量

    • System.arraycopy() 是底层方法,性能最优,适合大规模数据合并。
    • Stream API 可读性高,但涉及装箱拆箱(基本类型)和函数式调用,性能略低。
  2. 不可变数组
    Java 数组长度固定,所有合并操作都会创建新数组,原数组保持不变。

  3. 空数组处理
    上述方法均支持空数组(length=0),无需特殊处理。

  4. 多维数组深层合并
    若需合并多维数组的内层元素(例如合并两个二维数组的列),需手动遍历并处理每个子数组。

总结

  • 基本类型数组:优先使用 System.arraycopy() 或 Java 8+ 的 IntStream.concat()
  • 对象数组:推荐使用 Stream.concat() 或工具类封装。
  • 去重需求:结合 Set 实现。
  • 性能敏感场景:直接使用 System.arraycopy() 避免额外开销。
http://www.xdnf.cn/news/13117.html

相关文章:

  • 深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
  • [C#]基于winform部署PP-OCRv5的推理模型paddleocrv5模型部署
  • 算法:模拟
  • 网格三面角,散射过程推导
  • Oracle11g安装包
  • 【Ubuntu崩溃修复】
  • 二叉树-144.二叉树的前序遍历-力扣(LeetCode)
  • sql server连接遇到的问题
  • 【Java_EE】Spring MVC
  • C#中LINQ技术:自然语言集成与统一数据操作的艺术
  • CSS 布局指南
  • 函数01 day10
  • 数字孪生+AR/VR的融合创新
  • yolo模型精度提升策略
  • Vue数据响应式原理解析
  • 华为云Flexus+DeepSeek征文|体验华为云ModelArts快速搭建Dify-LLM应用开发平台并创建自己的AI-Agent
  • 安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
  • docker容器互联
  • Python----大模型(大模型基础)
  • Linux学习
  • 如何为服务器生成TLS证书
  • 【C++进阶篇】智能指针
  • DIC 应变测量系统助力混凝土 / 岩石断裂力学性能深度研究
  • 第2篇:BLE 广播与扫描机制详解
  • 【iSAQB软件架构】复杂系统架构描述的推荐实践
  • 在 Windows 11 上恢复旧版 Windows 10 右键菜单的命令
  • OPENCV形态学基础之二腐蚀
  • 使用python进行图像处理—图像滤波(5)
  • 常见的Linux命令
  • vue3 定时器-定义全局方法 vue+ts