结论:
对于基本数据类型的数组:
一维数组:深克隆;(重新分配空间,并将元素复制过去)
二维数组:浅克隆。(只传递引用)
代码
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
}
}