【java】基本类型数组的clone()方法是深克隆还是浅克隆?

xiaoxiao2022-05-13  27

目录

结论:代码如何实现二维数组的深克隆呢?一维对象数组的克隆深复制和浅复制:

结论:

对于基本数据类型的数组: 一维数组:深克隆;(重新分配空间,并将元素复制过去) 二维数组:浅克隆。(只传递引用)

代码

int[] a={3,1,4,2,5}; int[] b=a.clone(); b[0]=10; System.out.println(b[0]+" "+a[0]); 输出为10 3 可见改变了b的值,但是没有改变a的元素的值 补充说明:如果数组中存在的是我们自定义的类对象,那就不行了。感兴趣的看最后的补充例子。 int[][] a={{3,1,4,2,5},{4,2}}; int[][] b=a.clone(); b[0][0]=10; System.out.println(b[0][0]+" "+a[0][0]); 输出为10 10 int[][] a={{3,1,4,2,5},{4,2}}; int[][] b=a.clone(); b[0][0]=10; System.out.println(b[0][0]+" "+a[0][0]); System.out.println(a[0]==b[0]); 第5句输出为true。

如何实现二维数组的深克隆呢?

对每一维数组调用clone方法。

int[][] a={{3,1,4,2,5},{4,2}}; int[][] b=new int[a.length][]; for(int i=0;i<a.length;i++){ b[i]=a[i].clone(); } b[0][0]=10; System.out.println(b[0][0]+" "+a[0][0]); System.out.println(b[0]==a[0]); 输出为 10 3 false

一维对象数组的克隆

//浅克隆 class MyClass { int a; MyClass(int a){ this.a = a; } @Override public String toString() { return ""+a; } void changeValue(int x){ a = x; } } public class Blah { public static void main(String[] args) { MyClass[] a={new MyClass(1),new MyClass(2), new MyClass(3),new MyClass(4),new MyClass(5)}; MyClass[] b=a.clone(); b[0].changeValue(10); System.out.println(b[0]+" "+a[0]);//输出10 10 } } //深克隆 class MyClass implements Cloneable{ private int a; MyClass(int a){ this.a = a; } @Override public String toString() { return ""+a; } void changeValue(int x){ a = x; } @Override public MyClass clone(){ MyClass myClass = null; try { myClass = (MyClass) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } /*如果类中存在非基本类型的属性,需要在这里对属性进行克隆(通过调用属性的clone()方法。*/ return myClass; } } public class Blah { public static void main(String[] args) { MyClass[] a={new MyClass(1),new MyClass(2), new MyClass(3),new MyClass(4),new MyClass(5)}; MyClass[] b = new MyClass[a.length]; for(int i = 0; i < a.length; i++){ b[i] = a[i].clone(); } b[0].changeValue(10); System.out.println(b[0]+" "+a[0]);//输出10 1 } }

深复制和浅复制:

转载请注明原文地址: https://www.6miu.com/read-4884188.html

最新回复(0)