数组的复制/克隆
- 1.浅克隆
- 2.深克隆
- 3.使用System.ArrayCopy()方法
- 4.使用Arrays.copyOf()方法
- 5.使用Arrays.copyOfRange()方法
- 6.使用Object.clone()方法
1.浅克隆
将原来数组的地址赋值给新数组,两个数组名指向了同一个数组,修改其中一个中的元素,那么他们查询到的元素都是修改过的元素
public class Test01{public static void main(String [] args){int [] arr = {10,20,30,40};int [] newArr =new int[arr.length]; //创建一个新的数组,长度和原来数组一样newArr = arr ;//将原来数组的地址赋值给新数组arr[1] = 100; // 10 100 30 40 arr数组for(int i = 0;i<newArr.length;i++){System.out.println(newArr[i]+" "); //10 100 30 40 新数组}}
}
输出:
注意:任务是将arr的内容复制到newArr中,但是上面代码是数组地址的引用分配,这并不是真正的复制
2.深克隆
深克隆,为了解决浅克隆的问题,引用了for循环来将arr的元素,复制到newArr中。
public class Test01{public static void main(String [] args){int [] arr = {10,20,30,40};int [] newArr =new int[arr.length]; //创建一个新的数组,长度和原来数组一样for(int i= 0;i<newArr.length;i++){ //因为长度一样,所以遍历两个数组都可以newArr[i] = arr[i]; //将arr的每一个元素赋值给newArr对应的每一个元素}//修改arrarr[1] = 100; // 10 100 30 40 arr数组//打印arrfor (int j : arr) {System.out.print(j + " "); //10 100 30 40 arr数组}System.out.println();//打印newArrfor (int j : newArr) {System.out.print(j + " "); //10 20 30 40 newArr}}
}
输出:
结果表示,两个名字并不指向同一个数组地址
3.使用System.ArrayCopy()方法
java的system有一个ArrayCopy的方法可以将一个数组的元素复制到另外一个数组中
方法的原型:
public static void arraycopy(Object src_array ,int src_Pos,Object dest_array,int dest_Pos,int length)
理解:
- Object src_array:要用来复制元素的原数组
- int arc_Pos: 开始复制索引位置
- Object dest_array:目标数组
- int dest_Pos: 要复制的元素在目标数组中的起始索引
- int length: 要复制的数组长度
案例
public class Test01{public static void main(String [] args){int [] arr = {10,20,30,40};int [] newArr =new int[arr.length]; //创建一个新的数组,长度和原来数组一样System.arraycopy(arr,0,newArr,0,arr.length);//修改arrarr[1] = 100; // 10 100 30 40 arr数组//打印arrfor (int j : arr) {System.out.print(j + " "); //10 100 30 40 arr数组}System.out.println(); //打印newArrfor (int j : newArr) {System.out.print(j + " "); //10 20 30 40 newArr}}
}
输出:
结果表示System.ArrayCopy()方法是深度克隆
4.使用Arrays.copyOf()方法
copyOf()方法属于Arrays类,是java.util下的一部分,内部采用了arraycopy()。
方法原型:
public static int[] copyOf(原数组,要返回的数组长度)
案例
public class Test01{public static void main(String [] args){int [] arr = {10,20,30,40};int [] newArr = Arrays.copyOf(arr,arr.length);//修改arrarr[1] = 100; // 10 100 30 40 arr数组//打印arrfor (int j : arr) {System.out.print(j + " "); //10 100 30 40 arr数组}System.out.println();//打印newArrfor (int j : newArr) {System.out.print(j + " "); //10 20 30 40 newArr}}
}
输出:
5.使用Arrays.copyOfRange()方法
和copyOf()一样,内部也是用了arraycopy()。
方法原型:
public static int[] copyOfRange(原数组,起始索引,结束索引)
案例:
public class Test01{public static void main(String [] args){int [] arr = {10,20,30,40};int [] newArr = Arrays.copyOfRange(arr,0,arr.length);//修改arrarr[1] = 100; // 10 100 30 40 arr数组//打印arrfor (int j : arr) {System.out.print(j + " "); //10 100 30 40 arr数组}System.out.println();//打印newArrfor (int j : newArr) {System.out.print(j + " "); //10 20 30 40 newArr}}
}
输出:
6.使用Object.clone()方法
数组调用.clone()方法达到深克隆效果
public class Test01{public static void main(String [] args){int [] arr = {10,20,30,40};int [] newArr = arr.clone();//修改arrarr[1] = 100; // 10 100 30 40 arr数组//打印arrfor (int k : arr) {System.out.print(k + " "); //10 100 30 40 arr数组}System.out.println();//打印newArrfor (int j : newArr) {System.out.print(j + " "); //10 20 30 40 newArr}}
}
输出: