java拷贝引用
int a[] = {1,2};
int b[] = a;
System.out.println(a[0]); //print 1
System.out.println(b[0]); //print 1
a[0]=10000;
System.out.println(a[0]); //print 10000
System.out.println(b[0]); //print 10000 也随着a[0]改变而改变
如上所示我们其实只是将对象的引用从a传递给了b,当我们改变a的值时,b的值也会跟着改变。这不算真正的copy。
java浅层拷贝对象和深层拷贝
假设现在有对象obj1,它包含两个子对象containedObj1和containedObj2.
浅层拷贝就是创建一个新的实例,在内存中开辟新的地址生成obj2,但是obj2的子对象却没有被拷贝obj1的子对象,而是拷贝的obj1子对象的引用。
下面ArrayList里的clone()就是一个浅层拷贝的方法
ArrayList a = new ArrayList();
a.add(1);a.add(2)
ArrayList b = (ArrayList) a.clone();
System.out.println(a.get(0)); //print 1
System.out.println(b.get(0)); //print 1
a.set(0, 10000);
System.out.println(a.get(0)); //print 10000
System.out.println(b.get(0)); //print 1 没有随着a[0]改变而改变
然而当ArrayList里不是int类型而是其他对象类型时:
ArrayList<ArrayList> a = new ArrayList();
ArrayList objectInArr = new ArrayList();
objectInArr.add(1);
objectInArr.add(2);
a.add(objectInArr);
ArrayList<ArrayList> b = (ArrayList) a.clone();
System.out.println(a.get(0).get(0)); //print 1
System.out.println(b.get(0).get(0)); //print 1
objectInArr.set(0, 10000);
System.out.println(a.get(0).get(0)); //print 10000
System.out.println(b.get(0).get(0)); //print 10000 再次随着改变了
所以我们发现浅层拷贝拷贝不了子对象,这里就要用到深层拷贝。深层拷贝就是obj2不仅拷贝了obj1并且拷贝了obj1的所有子对象。
通常对于深层拷贝,我们需要根据情况自己构造一个函数来进行拷贝,来确保正确的复制。