Java复制数组的3种方法(附带实例)
当我们要将一个数组中的元素复制到另一个数组中时就涉及数组复制。
由于 Java 中的数组属于引用类型,因此并不能直接通过赋值运算符进行复制。例如:
arraycopy() 方法一共有 5 个参数:
观察如下的实例程序:
下面实例程序中使用 Arrays.copyOf() 方法进行数组复制,可以指定要复制的长度,如果其超过源数组的长度则会使用数组类型的默认值(即 null)填充多余的元素。
copyOfRange() 方法指定了三个参数,第一个参数表示源数组,第二个参数表示起始位置,第三个参数表示结束位置。
根据下面实例及其输出结果可以清楚了解该方法的用法:
由于 Java 中的数组属于引用类型,因此并不能直接通过赋值运算符进行复制。例如:
int[] a = {1,2,3,4}; int[] b = a;实例中存在一个数组 a,将其直接赋值给数组 b 后,实际上并没有复制数组,而只是将变量 b 指向变量 a 所指向的内存空间。
System.arraycopy()方法
System 类提供了 arraycopy() 方法用于数组复制,该方法的性能更高而且更加方便,它可以将源数组中指定范围的元素复制到目标数组的指定位置。arraycopy() 方法一共有 5 个参数:
- 第一个表示源数组;
- 第二个表示源数组的起始位置;
- 第三个表示目标数组;
- 第四个表示目标数组的起始位置;
- 第五个表示要复制的长度。
观察如下的实例程序:
public class ArrayCopyTest2 { public static void main(String[] args) { String[] arr1 = { "Java", "数组", "字符串", "复制" }; String[] arr2 = new String[8]; String[] arr3 = new String[8]; System.arraycopy(arr1, 0, arr2, 2, 4); System.arraycopy(arr1, 2, arr3, 5, 2); System.out.println(Arrays.toString(arr1)); System.out.println(Arrays.toString(arr2)); System.out.println(Arrays.toString(arr3)); } }输出结果:
[Java, 数组, 字符串, 复制] [null, null, Java, 数组, 字符串, 复制, null, null] [null, null, null, null, null, 字符串, 复制, null]将数组 arr1 复制到 arr2 和 arr3 中,重点关注源数组的起始位置、目标数组的起始位置以及复制长度这三个参数值,根据输出结果基本就能了解 arraycopy() 方法的用法了。
Arrays.copyOf()方法
Arrays 类也提供了 copyOf() 方法用于对数组进行复制,它可以复制源数组中指定长度的元素并返回复制后的新数组。下面实例程序中使用 Arrays.copyOf() 方法进行数组复制,可以指定要复制的长度,如果其超过源数组的长度则会使用数组类型的默认值(即 null)填充多余的元素。
public class ArrayCopyTest3 { public static void main(String[] args) { String[] arr1 = { "Java", "数组", "字符串", "复制" }; String[] arr2 = Arrays.copyOf(arr1, arr1.length); String[] arr3 = Arrays.copyOf(arr1, 3); String[] arr4 = Arrays.copyOf(arr1, 6); System.out.println(Arrays.toString(arr1)); System.out.println(Arrays.toString(arr2)); System.out.println(Arrays.toString(arr3)); System.out.println(Arrays.toString(arr4)); } }输出结果:
[Java, 数组, 字符串, 复制] [Java, 数组, 字符串, 复制] [Java, 数组, 字符串] [Java, 数组, 字符串, 复制, null, null]
Arrays.copyOfRange()方法
Arrays 类还提供了另一个复制方法 copyOfRange(),从名字可以看出它与 copyOf() 方法的差别在于它可以指定复制范围。copyOfRange() 方法指定了三个参数,第一个参数表示源数组,第二个参数表示起始位置,第三个参数表示结束位置。
根据下面实例及其输出结果可以清楚了解该方法的用法:
public class ArrayCopyTest4 { public static void main(String[] args) { String[] arr1 = { "Java", "数组", "字符串", "复制" }; String[] arr2 = Arrays.copyOfRange(arr1, 0, 4); String[] arr3 = Arrays.copyOfRange(arr1, 1, 3); String[] arr4 = Arrays.copyOfRange(arr1, 2, 6); System.out.println(Arrays.toString(arr1)); System.out.println(Arrays.toString(arr2)); System.out.println(Arrays.toString(arr3)); System.out.println(Arrays.toString(arr4)); } }输出结果为:
[Java, 数组, 字符串, 复制] [Java, 数组, 字符串, 复制] [数组, 字符串] [字符串, 复制, null, null]需要注意的是,结束位置对应的元素不参与复制。另外,如果结束位置超过源数组长度,则会以 null 进行填充。