浅拷贝:
数组如果存放引用类型地址,进行拷贝后,原数组中存放的地址拷贝到新数组中,此时是两个相同的引用指向一个对象。如果原数组把内容更改,拷贝的数组内容对应也做更改。
深拷贝:
新数组的地址与原数组的地址不同,不是简单的引用拷贝。原数组内容改变时,新数组的内容不会改变。
数组内容是简单类型的,如int、float甚至String类型,使用clone()、copyOf()、arraycopy()方法拷贝,实现的都是深拷贝。新的数组放在一个新的地址中。
int arr1[] = {1,2,3};int arr2[] = arr1.clone();int arr3[] = pyOf(arr1, arr1.length);int arr4[] = new int[3];System.arraycopy(arr1, 0, arr4, 0, arr1.length);arr1[2] = 9; //改变arr1 看看复制的数组有无改变System.out.println("clone方法克隆:");System.out.String(arr2)); //[1, 2, 3]System.out.println("copyOf方法克隆:");System.out.String(arr3)); //[1, 2, 3]System.out.println("arraycopy方法克隆:");System.out.String(arr4)); //[1, 2, 3]
但一个多维数组的拷贝,不能直接用以上三个方法直接拷贝。而应该用for循环,把多维数组分成一维的数组来拷贝,这样每个一维数组都是一个新的地址,组合成的多维数组也是新的地址。
int arr1[][] = {{1,1,1},{2,2,2},{3,3,3}};int arr2[][] = new int[3][3];for(int i = 0;i < 3;i++) {arr2[i] = arr1[i].clone();}int arr3[][] = new int[3][3];for(int i = 0;i < 3;i++) {arr3[i] = pyOf(arr1[i], arr1[i].length);}int arr4[][] = new int[3][3];for(int i = 0;i < 3;i++) {System.arraycopy(arr1[i], 0, arr4[i], 0, arr1[i].length);}arr1[2][2] = 9; //改变arr1 看看复制的数组有无改变System.out.println("clone方法克隆:");for(int i = 0;i < 3;i++) {System.out.println(arr2[i]); //[I@15db9742 [I@6d06d69c [I@7852e922}System.out.println("copyOf方法克隆:");for(int i = 0;i < 3;i++) {System.out.println(arr3[i]); //[I@4e25154f [I@70dea4e [I@5c647e05}System.out.println("arraycopy方法克隆:");for(int i = 0;i < 3;i++) {System.out.println(arr4[i]); //[I@33909752 [I@55f96302 [I@3d4eac69}
本文发布于:2024-02-05 05:44:48,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170725475163544.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |