在Java中,如何把两个String[]合并为一个?

看起来是一个很简单的问题。但是如何才能把代码写得高效简洁,却还是值得思考的。这里介绍四种方法,请参考选用。

一、apache-commons

这是最简单的办法。在apache-commons中,有一个ArrayUtils.addAll(Object[], Object[])方法,可以让我们一行搞定:

String[]both =(String[])ArrayUtils.addAll(first,second);

其它的都需要自己调用jdk中提供的方法,包装一下。

为了方便,我将定义一个工具方法concat,可以把两个数组合并在一起:

staticString[]concat(String[]first,String[]second){}

为了通用,在可能的情况下,我将使用泛型来定义,这样不仅String[]可以使用,其它类型的数组也可以使用:

staticT[]concat(T[]first,T[]second){}

当然如果你的jdk不支持泛型,或者用不上,你可以手动把T换成String。

二、System.arraycopy()

static String[] concat(String[] a, String[] b) {

String[] c= new String[a.length+b.length];

System.arraycopy(a, 0, c, 0, a.length);

System.arraycopy(b, 0, c, a.length, b.length);

return c;

}

static String[] concat(String[] a, String[] b) {

String[] c= new String[a.length+b.length];

System.arraycopy(a, 0, c, 0, a.length);

System.arraycopy(b, 0, c, a.length, b.length);

return c;

}

使用如下:

String[]both =concat(first,second);

三、Arrays.copyOf()

在java6中,有一个方法Arrays.copyOf(),是一个泛型函数。我们可以利用它,写出更通用的合并方法:

public static  T[] concat(T[] first, T[] second) {

T[] result = Arrays.copyOf(first, first.length + second.length);

System.arraycopy(second, 0, result, first.length, second.length);

return result;

}

public static T[] concat(T[] first, T[] second) {

T[] result = Arrays.copyOf(first, first.length + second.length);

System.arraycopy(second, 0, result, first.length, second.length);

return result;

}

如果要合并多个,可以这样写:

public static  T[] concatAll(T[] first, T[]... rest) {

int totalLength = first.length;

for (T[] array : rest) {

totalLength += array.length;

}

T[] result = Arrays.copyOf(first, totalLength);

int offset = first.length;

for (T[] array : rest) {

System.arraycopy(array, 0, result, offset, array.length);

offset += array.length;

}

return result;

}

public static T[] concatAll(T[] first, T[]... rest) {

int totalLength = first.length;

for (T[] array : rest) {

totalLength += array.length;

}

T[] result = Arrays.copyOf(first, totalLength);

int offset = first.length;

for (T[] array : rest) {

System.arraycopy(array, 0, result, offset, array.length);

offset += array.length;

}

return result;

}

使用如下:

String[]both =concat(first,second);String[]more =concat(first,second,third,fourth);

四、Array.newInstance

还可以使用Array.newInstance来生成数组:

private static  T[] concat(T[] a, T[] b) {

final int alen = a.length;

final int blen = b.length;

if (alen == 0) {

return b;

}

if (blen == 0) {

return a;

}

final T[] result = (T[]) java.lang.reflect.Array.

newInstance(a.getClass().getComponentType(), alen + blen);

System.arraycopy(a, 0, result, 0, alen);

System.arraycopy(b, 0, result, alen, blen);

return result;

}

Java合并两个int数组合并_Java中如何把两个数组合并为一个相关推荐

  1. 两个byte数组拼接_java中两个byte数组实现合并的示例

    java中两个byte数组实现合并的示例 今天在于硬件进行交互的过程中,要到了了需要两个数组进行合并,然后对数组进行反转和加密操作,以下是两个byte数组合并的方法. /** * * @param d ...

  2. java实现对大文件切割下载_Java实现大文件的切割与合并操作示例

    Java实现大文件的切割与合并操作示例 发布时间:2020-09-27 02:25:08 来源:脚本之家 阅读:99 作者:HiBoyljw 本文实例讲述了Java实现大文件的切割与合并操作.分享给大 ...

  3. int数组初始化_Java中到底有没有多维数组

    Java 中没有多维数组的概念,从数组底层的运行机制上来看 Java 没有多维数组,但是 Java 提供了支持多维数组的语法,可以实现多维数组的功能. Java 语言里的数组类型是引用类型,因此数组变 ...

  4. java arraylist与数组转换_java中String,数组,ArrayList三者之间的转换

    免费资源网 - https://freexyz.cn/ ArrayList转为String和数组 造一个元素为Integer的ArrayList 为list_int 造一个元素为String 的 Ar ...

  5. java中调用数组参数_java中如何调用带有数组类型参数的存储过程

    java中如何调用带有数组类型参数的存储过程 关注:95  答案:3  mip版 解决时间 2021-01-28 00:39 提问者万丈深渊 2021-01-27 14:00 不知道java中java ...

  6. java 打印byte数组内容_java中打印byte数组

    JAVA字节转换 字节(Byte)简称:"B",字位(Bit)简称"b", 1 个字位(Bit)=1 个二进制数, 1 个字节=8 个字位=8 个二进制数, 1 ...

  7. java 数组 内存_Java 中数组的内存分配

    Java 中数组的内存分配 1.Java 程序在运行时,需要在内存中分配空间.为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式. 2.数组基本概念 数组是 ...

  8. java 数组 包含_Java中高效的判断数组中某个元素是否存在详解

    一.检查数组是否包含某个值的方法 使用List public static boolean useList(String[] arr, String targetValue) { return Arr ...

  9. java 数组遍历_Java中遍历数组使用foreach循环还是for循环?

    从JDK1.5起,增加了新功能Foreach,它是for循环遍历数据的一种简写形式,使用的关键字依然是for,但参数格式不同.其详细用法为: for(Type e:collection){ //对变量 ...

  10. java多线程同步的四种方法_java中实现多线程的两种方法

    java多线程有几种实现方法,都是什么?同步有几种实java中多线程的实现方法有两种:1.直接继承thread类:2.实现runnable接口:同步的实现方法有五种:1.同步方法:2.同步代码块:3. ...

最新文章

  1. 不用写代码就能学用Pandas,适合新老程序员的神器Bamboolib
  2. html传递guid参数,C#中的Guid.ToString鲜为人知参数用法
  3. mysql union 放弃索引_MySQL的or/in/union与索引优化
  4. xtrabackup mysql 5.6_percona-xtrabackup工具实现mysql5.6.34的主从同步复制
  5. .NET 6新特性试用 | record struct
  6. *【HDU - 1506】【POJ - 2559】Largest Rectangle in a Histogram(单调栈或动态规划)
  7. 研发人员为什么留不住
  8. git命令:将多个commit提交记录修改为1条
  9. python最常用的编程方式是什么_python常用模块和对象编程
  10. Pipeline Alpha版本项目展示
  11. 一个15年的架构师谈“如何成为一名优秀的解决方案架构师”
  12. Openlayer:学习笔记之交互
  13. 论文写作——latex三线表tabular*文本居中与正文两端对齐、标题加黑
  14. 为Raspberry Pi 2编译内核模块
  15. java opencv 纠偏_一种基于OpenCV的高拍仪拍摄文档物体纠偏方法与流程
  16. java中包、不同包下类之间的访问以及编译和运行示例
  17. 计算机一级考试的时候用计算器,在WPS文字里设置计算器功能
  18. 【量化笔记】技术指标 Technical Indicator
  19. QQ样式的在线客服代码
  20. CodeM 第三题 世界杯

热门文章

  1. 基于曲率的体素聚类的三维激光雷达点云实时鲁棒分割方法
  2. 根据相机外参实现单应矩阵计算的理论与实践
  3. 计算机图形学——BRDF
  4. 【讲人话】Angular如何通过@ViewChildren获取实时渲染的动态DOM节点元素(@ViewChild只能获取静态的固定DOM节点)
  5. 《中国式方案秘籍(上部)》
  6. 《初级前端开发人员经常容易忽视几个细节问题汇总》
  7. 在Ubuntu 14.04 64bit上安装Master PDF Editor 3.2.81
  8. Data - 数据思维 - 上篇
  9. [Swift]LeetCode901. 股票价格跨度 | Online Stock Span
  10. react实现全选、取消全选和个别选择