所谓复制数组,是指将一个数组中的元素在另一个数组中进行复制。
在 Java 中实现数组复制分别有以下 4 种方法:
1.Arrays 类的 copyOf() 方法
2.Arrays 类的 copyOfRange() 方法
3.System 类的 arraycopy() 方法
4.Object 类的 clone() 方法
具体如下:
1.Arrays 类的 copyOf() 方法:复制数组至指定长度
Arrays.copyOf(dataType[] srcArray,int length);
其中,srcArray 表示要被复制的数组,length 表示复制后的新数组的长度。
默认从原数组的第一个元素(索引值为 0)开始复制,目标数组的长度将为 length。如果 length 大于 srcArray.length,则目标数组中采用默认值填充;如果 length 小于 srcArray.length,则复制到第 length 个元素(索引值为 length-1)即止。
import java.util.Arrays;
public class Test19{
public static void main(String[] args) {
// 定义长度为 5 的数组
int arr[] = new int[]{1,2,3,4,5};
// 输出原数组
System.out.println("原数组内容如下:");
// 循环遍历输出原数组
for(int i=0;i
在上述代码中,由于原数组 arr的长度为 5,而要复制的新数组 new_arr 的长度为 8,因此在将原数组中的 5 个元素复制完之后,会采用默认值填充剩余 3 个元素的内容。
因为原数组 arr的数据类型为 int,而**使用 Arrays.copyOf(arr,8) 方法复制数组之后返回的是 Object[] 类型,**因此需要将 Object[] 数据类型强制转换为 int[] 类型。同时,也正因为 arr的数据类型为 int,因此默认值为 0。
运行的结果如下所示。
原数组内容如下:
1 2 3 4 5
复制的新数组内容如下:
1 2 3 4 5 0 0 0
2. 使用 CopyOfRange() 方法对数组进行复制:将指定数组的指定长度复制到一个新数组中。
Arrays 类的 CopyOfRange() 方法是另一种复制数组的方法,其语法形式如下:
Arrays.copyOfRange(dataType[] srcArray,int startIndex,int endIndex)
其中:
srcArray 表示原数组。
startIndex 表示开始复制的起始索引,目标数组中将包含起始索引对应的元素,另外,startIndex 必须在 0 到 srcArray.length 之间。
endIndex 表示终止索引,目标数组中将不包含终止索引对应的元素,endIndex 必须大于等于 startIndex,可以大于 srcArray.length,如果大于 srcArray.length,则目标数组中使用默认值填充。
注意:从下标startIndex开始复制,复制到上标endIndex,生成一个新的数组。注意这里包括下标startIndex,不包括上标endIndex。
3.使用 arraycopy() 方法
System.arraycopy(dataType[] srcArray,int srcIndex,int destArray,int destIndex,int length)
其中,srcArray 表示原数组;srcIndex 表示原数组中的起始索引;destArray 表示目标数组;destIndex 表示目标数组中的起始索引;length 表示要复制的数组长度。
。
使用此方法复制数组时,length+srcIndex 必须小于等于 srcArray.length,同时 length+destIndex 必须小于等于 destArray.length。
int[] arr ={1,2,3,4,5,6};
System.arraycopy(arr,0,arr,3,3);
System.out.println(Arrays.toString(arr));
则结果为:[1,2,3,1,2,3];
3.clone() 方法
clone() 方法也可以实现复制数组。该方法是类 Object 中的方法,可以创建一个有单独内存空间的对象。因为数组也是一个 Object 类,因此也可以使用数组对象的 clone() 方法来复制数组。
clone() 方法的返回值是 Object 类型,要使用强制类型转换为适当的类型。其语法形式比较简单:
array_name.clone()
示例语句如下:
int[] targetArray=(int[])sourceArray.clone();
例如:
public class Test22 {
public static void main(String[] args) {
// 定义原数组,长度为8
int scores[] = new int[] { 100, 81, 68, 75, 91, 66, 75, 100 };
System.out.println("原数组中的内容如下:");
// 遍历原数组
for (int i = 0; i < scores.length; i++) {
System.out.print(scores[i] + "\t");
}
// 复制数组,将Object类型强制转换为int[]类型
int newScores[] = (int[]) scores.clone();
System.out.println("\n目标数组内容如下:");
// 循环遍历目标数组
for (int k = 0; k < newScores.length; k++) {
System.out.print(newScores[k] + "\t");
}
}
}
在该程序中,首先定义了一个长度为 8 的 scores 数组,并循环遍历该数组输出数组中的元素,然后定义了一个名称为 newScores 的新数组,并使用 scores.clone() 方法将 scores 数组中的元素复制给 newScores 数组。最后循环遍历 newScores 数组,输出数组元素。
程序运行结果如下所示。
原数组中的内容如下:
100 81 68 75 91 66 75 100
目标数组内容如下:
100 81 68 75 91 66 75 100
从运行的结果可以看出,scores 数组的元素与 newScores 数组的元素是相同的。
注意:以上几种方法都是浅拷贝(浅复制)。浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化。深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变。