章
目
录
学习连接两个基本数组或对象数组以创建一个由两个数组中的元素组成的新数组。我们将学习使用简单的for 循环、Stream API和其他实用程序类来合并数组项。
请注意,无论我们使用哪种技术来合并数组,它总是会创建一个具有两个数组长度组合的新数组,然后在循环中一次一个地将两个数组中的元素复制到新数组中。因此,下面讨论的各种方法之间的主要区别是代码的可读性和易用性。
1. 使用“for 循环”连接数组
直接使用for循环合并数组在性能上是最高效的。它不会创建不必要的临时变量和对象。
我们创建一个由两个给定数组的组合长度组成的新数组,然后开始循环将两个数组中的元素放入新数组中。理论上,这种方法应该能提供最佳性能。
int[] intArray1 = {1, 2, 3};
int[] intArray2 = {4, 5, 6};
result = new int[intArray1.length + intArray2.length];
int index = 0;
for (int item: intArray1) {
result[index++] = item;
}
for (int item: intArray2) {
result[index++] = item;
}
System.out.println(Arrays.toString(result)); //[1, 2, 3, 4, 5, 6]
2.使用System.arraycopy()
使用arraycopy()
相当于使用for 循环。这里我们将把数组项复制到新数组的任务委托给native
函数 arraycopy()
。
就性能而言,arraycopy()方法的性能应与for 循环方法相当。
int[] intArray1 = {1, 2, 3};
int[] intArray2 = {4, 5, 6};
int[] result = new int[intArray1.length + intArray2.length];
System.arraycopy(intArray1, 0, result, 0, intArray1.length);
System.arraycopy(intArray2, 0, result, intArray1.length, intArray2.length);
System.out.println(Arrays.toString(result)); //[1, 2, 3, 4, 5, 6]
我们可以编写一个泛型类型方法,可用于合并包含任何对象类型的项的数组。
static <T> T[] concatArrays(T[] array1, T[] array2) {
T[] result = Arrays.copyOf(array1, array1.length + array2.length);
System.arraycopy(array2, 0, result, array1.length, array2.length);
return result;
}
//Invoking the method
String[] resultObj = concatArrays(strArray1, strArray2);
System.out.println(Arrays.toString(resultObj)); //[1, 2, 3, 4, 5, 6]
3. 使用 Stream.concat() 合并数组
该stream.concat()
方法创建一个延迟连接的流,其元素是第一个流的所有元素,后跟第二个流的所有元素。
为了获得流,我们将数组转换为流,然后用concat()来合并流。稍后,我们可以将流项收集到一个数组中以完成合并过程。
String[] strArray1 = {"1", "2", "3"};
String[] strArray2 = {"4", "5", "6"};
String[] both = Stream.concat(Arrays.stream(strArray1),
Arrays.stream(strArray2))
.toArray(String[]::new);
我们可以使用这种技术在一条语句中连接两个以上的数组。
String[] mergedArray = Stream.concat(Arrays.stream(strArray1),
Arrays.stream(strArray2),
Arrays.stream(strArray3),
Arrays.stream(strArray4))
.toArray(String[]::new);
要合并基本数据类型数组,我们可以直接使用以下类:
- IntStream
- LongStream
- DoubleStream
这些类提供了针对这些基本数据类型特定的concat()方法。
int[] intArray1 = {1, 2, 3};
int[] intArray2 = {4, 5, 6};
int[] result = IntStream.concat(Arrays.stream(intArray1),
Arrays.stream(intArray2))
.toArray();
4.Apache Commons 的 ArrayUtils
我们可以使用第三部分库,它提供了易于使用的一行方法来合并数组。它们还提供与以前的方法相同水平的性能。
类似的 API 是ArrayUtils.addAll()
将给定数组的所有元素添加到一个新数组中。请注意,返回的数组始终返回一个新数组,即使我们正在合并两个数组并且其中一个数组是null
。
String[] resultObj = ArrayUtils.addAll(strArray1, strArray2);
int[] result = ArrayUtils.addAll(intArray1, intArray2);
5.Guava API
Guava API 提供了以下类,我们可以使用它们来合并基元数组以及对象类型数组。
Ints.concat()
: 连接两个int
数组。Longs.concat()
: 连接两个long
数组。Doubles.concat()
: 连接两个double
数组。ObjectArrays.concat()
:连接两个object
类型数组。
String[] resultObj = ObjectArrays.concat(strArray1, strArray2, String.class);
int[] result = Ints.concat(intArray1, intArray2);
六,结论
在本教程中,我们学习了在 Java 中合并两个数组。我们学习了如何使用本机 Java API 以及来自第 3 方库的实用程序类。
对于小型阵列,上述所有方法都将提供几乎相同水平的性能。对于大型阵列,建议在最终确定该方法之前进行性能测试。然而从理论上讲,使用for-loop和arraycopy()方法应该提供最佳性能。