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

java 数组 拼接 详解

在 Java 中,数组拼接是一个常见的操作。由于数组是固定大小的数据结构,无法直接扩展,因此需要创建一个新的数组,将多个数组的数据复制到新数组中。下面是各种拼接数组的方法及其详细解释。


1. 使用 System.arraycopy()

System.arraycopy() 是一种高效的方法,可以将一个数组的内容复制到另一个数组。

实现步骤
  1. 创建一个新数组,大小为需要拼接的所有数组的长度之和。
  2. 使用 System.arraycopy() 将源数组的数据复制到目标数组中。
示例
public class ArrayConcat {
    public static void main(String[] args) {
        int[] array1 = {1, 2, 3};
        int[] array2 = {4, 5, 6};

        // 创建新数组
        int[] result = new int[array1.length + array2.length];

        // 复制第一个数组到 result
        System.arraycopy(array1, 0, result, 0, array1.length);

        // 复制第二个数组到 result
        System.arraycopy(array2, 0, result, array1.length, array2.length);

        // 输出结果
        for (int num : result) {
            System.out.print(num + " "); // 输出: 1 2 3 4 5 6
        }
    }
}
优点
  • 高效,底层使用了系统级复制。
  • 支持多维数组。

2. 使用 Arrays.copyOf()

Arrays.copyOf()java.util.Arrays 提供的方法,可以创建新的数组并复制内容。

实现步骤
  1. 使用 Arrays.copyOf() 创建一个足够大的新数组。
  2. 使用 System.arraycopy() 将第二个数组复制到新数组的剩余部分。
示例
import java.util.Arrays;

public class ArrayConcat {
    public static void main(String[] args) {
        int[] array1 = {1, 2, 3};
        int[] array2 = {4, 5, 6};

        // 创建新数组并复制 array1 的内容
        int[] result = Arrays.copyOf(array1, array1.length + array2.length);

        // 复制 array2 的内容到 result
        System.arraycopy(array2, 0, result, array1.length, array2.length);

        // 输出结果
        System.out.println(Arrays.toString(result)); // 输出: [1, 2, 3, 4, 5, 6]
    }
}
优点
  • 语法简洁,特别适合拼接两个数组。

3. 使用 Streams 拼接(适用于对象数组)

对于对象数组(如 String[]Integer[] 等),可以使用 Stream.concat 方法来拼接数组。

实现步骤
  1. 使用 Stream.of() 将数组转换为流。
  2. 使用 Stream.concat() 合并流。
  3. 使用 toArray() 方法将流转换回数组。
示例
import java.util.stream.Stream;

public class ArrayConcat {
    public static void main(String[] args) {
        String[] array1 = {"A", "B", "C"};
        String[] array2 = {"D", "E", "F"};

        // 使用 Stream 拼接
        String[] result = Stream.concat(Stream.of(array1), Stream.of(array2))
                                .toArray(String[]::new);

        // 输出结果
        for (String str : result) {
            System.out.print(str + " "); // 输出: A B C D E F
        }
    }
}
注意
  • 对于基本数据类型数组(如 int[]),需要先转换为对象数组(如 Integer[]),拼接完成后再转换回基本类型。

4. 手动拼接(循环)

通过手动循环的方式,可以将多个数组的数据复制到新数组中。

实现步骤
  1. 创建一个新数组,大小为所有数组长度之和。
  2. 使用循环逐个复制数据。
示例
public class ArrayConcat {
    public static void main(String[] args) {
        int[] array1 = {1, 2, 3};
        int[] array2 = {4, 5, 6};

        // 创建新数组
        int[] result = new int[array1.length + array2.length];

        // 手动复制 array1
        for (int i = 0; i < array1.length; i++) {
            result[i] = array1[i];
        }

        // 手动复制 array2
        for (int i = 0; i < array2.length; i++) {
            result[array1.length + i] = array2[i];
        }

        // 输出结果
        for (int num : result) {
            System.out.print(num + " "); // 输出: 1 2 3 4 5 6
        }
    }
}
优点
  • 灵活,可以轻松定制拼接逻辑。
  • 不依赖额外的工具类。
缺点
  • 代码较为冗长,不如其他方法简洁。

5. 使用 ArrayUtils.addAll()(Apache Commons Lang 库)

ArrayUtils.addAll() 是 Apache Commons Lang 提供的一个工具方法,可以直接拼接数组。

实现步骤
  1. 引入 Apache Commons Lang 的依赖。
  2. 使用 ArrayUtils.addAll() 方法拼接多个数组。
示例
import org.apache.commons.lang3.ArrayUtils;

public class ArrayConcat {
    public static void main(String[] args) {
        int[] array1 = {1, 2, 3};
        int[] array2 = {4, 5, 6};

        // 使用 ArrayUtils 拼接
        int[] result = ArrayUtils.addAll(array1, array2);

        // 输出结果
        for (int num : result) {
            System.out.print(num + " "); // 输出: 1 2 3 4 5 6
        }
    }
}
优点
  • 简洁高效。
  • 支持基本类型数组和对象数组。
缺点
  • 需要引入外部库。

Maven 依赖

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

6. 对比不同方法

方法优点缺点
System.arraycopy()高效,适合需要性能的场景使用稍显复杂,不如其他方法简洁
Arrays.copyOf()语法简洁,适合拼接两个数组不支持直接拼接多个数组
Streams.concat()简洁优雅,支持对象数组不适用于基本类型数组
手动拼接灵活,可自定义逻辑代码冗长,容易出错
ArrayUtils.addAll()简洁,支持基本类型和对象数组需要引入 Apache Commons Lang 外部库

7. 总结

  • 性能优先:推荐使用 System.arraycopy(),它底层实现是高效的本地方法。
  • 简洁性优先:推荐使用 Arrays.copyOf()ArrayUtils.addAll()
  • 对象数组:推荐使用 Streams.concat()
  • 手动操作:适合需要灵活自定义逻辑的场景,但需注意代码维护性。

选择适合的拼接方法,可以根据代码的复杂度需求、性能要求和实际场景来权衡。


http://www.kler.cn/a/397551.html

相关文章:

  • React Native 全栈开发实战班 - 网络与数据之网络请求基础
  • 【SpringBoot】公共字段自动填充
  • 对称加密算法DES的实现
  • python面向对象基础入门
  • hive表名重命名、rename重命名
  • SwanLab安装教程
  • SpringBoot集成热部署
  • 1.7 JS性能优化
  • 黑盒测试案例设计方法的使用(1)
  • 【项目开发】Web App vs Native App,开发者作何选择?
  • 【CVPR2024】2024年CVPR的3D 目标检测的综述(还在补充中)
  • Java 异常处理
  • 31.3 XOR压缩和相关的prometheus源码解读
  • MySQL的编程语言
  • 鸿蒙 管理应用拥有的状态有Localstorage、Appstorage、PersistentStorage、Environment、用户首选项、持久化方案。
  • react项目通过http调用后端springboot服务最简单示例
  • 如何在 Ubuntu 上安装 Emby 媒体服务器
  • 【人工智能】迁移学习在深度学习中的应用:用Python实现自定义数据集图像分类
  • 云原生之运维监控实践-使用Telegraf、Prometheus与Grafana实现对InfluxDB服务的监测
  • 【自学笔记】神经网络(2) -- 模型评估和优化
  • ArrayList 源码分析
  • 【鸿蒙开发】第十八章 Media媒体服务(一)
  • 37.超级简易的计算器 C语言
  • SpringBoot使用AspectJ的@Around注解实现AOP全局记录接口:请求日志、响应日志、异常日志
  • 打印1~N
  • PHP正则表达式