Java 数组的四种拷贝方法分别是:
- for循环
- Arrays.copyOf()
- System.arraycopy()
- clone()
一、深拷贝、浅拷贝
深拷贝:修改原数组,不影响新数组
浅拷贝:修改原数组,影响新数组
二、for循环
public static int[] copyArray(int[] array){
int[] tmp = new int[array.length];
for (int i = 0; i < array.length; i++) {
tmp[i] = array[i];
}
return tmp;
}
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
System.out.println(Arrays.toString(array));
System.out.println("=====拷贝后======");
int[] ret = copyArray(array);
System.out.println(Arrays.toString(ret));
}
运行结果
[1, 2, 3, 4, 5]
=====拷贝后======
[1, 2, 3, 4, 5]
三、Arrays.copyOf()
Arrays.copyOf底层其实是用System.arraycopy ,属于浅拷贝
Arrays.copyOf(要拷贝的数组名,拷贝的长度)
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
System.out.println(Arrays.toString(array));
System.out.println("=====拷贝后======");
int[] ret = Arrays.copyOf(array,array.length);
System.out.println(Arrays.toString(ret));
}
四、System.arraycopy()
属于浅拷贝
system.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
Object src :原数组名
int srcPos :原数组中开始拷贝的位置
Object dest:目标数组名
int destPos:开始位置
int length :要拷贝的长度
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
System.out.println(Arrays.toString(array));
System.out.println("=====拷贝后======");
int[] copy = new int[array.length];
System.arraycopy(array,0,copy,0,array.length);
System.out.println(Arrays.toString(copy));
}
注:是四种拷贝方式里速度最快的
五、clone()
属于浅拷贝
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
System.out.println(Arrays.toString(array));
System.out.println("=====拷贝后======");
int[] ret = array.clone();
System.out.println(Arrays.toString(ret));
}
总结:引用类数组,是浅拷贝;基本类型,是深拷贝。