java数组拷贝的四种方法
- for循环拷贝数组
- 工具类-Arrays.copyOf
- 工具类-System.arraycopy
- clone()方法
1. for循环拷贝数组
import java.util.Arrays;
public class test2020_12_23 {
public static int[] mycopy(int[] arr) {
int[] ret = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
ret[i] = arr[i];
}
return ret;
}
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,88,6,9,33,22,25};
mycopy(arr);
System.out.println(Arrays.toString(arr));
}
}
实现自己版本的for循环对整型数组进行拷贝。
2. 工具类-Arrays.copyOf
import java.util.Arrays;
public class test2020_12_23 {
public static void main(String[] args) {
int[] arr = {1,2,3,88,6,9,33,22,25};
int[] newarr = Arrays.copyOf(arr,arr.length);
System.out.println(Arrays.toString(newarr));
}
}
其中,也可以只拷贝某个范围,如下:
int[] newarr = Arrays.copyOfRange(arr,2,4);
可以看出,这个区间是左闭右开的。
如果说,第二个参数超过了数组的长度,会发生什么情况呢?
int[] newarr = Arrays.copyOfRange(arr,2,15);
由运行结果可以看出,默认由0来填充了。
3. 工具类-System.arraycopy
import java.util.Arrays;
public class test2020_12_23 {
public static void main(String[] args) {
int[] arr1 = {1,2,3,88,6,9,33,22,25};
int[] arr2 = new int[arr1.length];
System.arraycopy(arr1,0,arr2,0,arr1.length);
System.out.println(Arrays.toString(arr2));
}
}
在底层代码中,arraycopy是被native修饰的,这说明这是由C/C++实现的,我们是看不到具体实现的。特点是:运行速度快。需要注意的是,它在本地方法栈中运行。
4. arr1.clone()方法
import java.util.Arrays;
public class test2020_12_23 {
public static void main(String[] args) {
int[] arr1 = {1,2,3,88,6,9,33,22,25};
int[] arr2 = arr1.clone();
System.out.println(Arrays.toString(arr2));
}
}
总结:
当数组中存储的是引用类型时,本文四种方式都是浅拷贝。如果是简单类型,就是深拷贝。深拷贝即又创建了一个数组对象,拷贝原来数组中的所有元素到新数组中,因此,修改原数组,不会影响到新数组。