java中的深拷贝
对象拷贝有时让我们忽视其重要性,又或者因为想当然而导致若干程序问题。
浅拷贝
浅拷贝即普通拷贝,即对要拷贝的对象进行复制。例如对于Entity类:
class Entity{
int a;
String b;
List<String> c;
List<Object> d;
}
对于Entity类的对象entity,把entity的对象直接赋给另一个变量也算是一种浅拷贝,这样就有两个变量指向堆中同一个对象。更近一层的浅拷贝是还要对
entity对象中的各个属性进行复制,即重新new一个Entity类对象,再将a、b、c、d属性复制赋给新创建的对象:
Entity entity2 = new Entity();
entity2.a = entity.a;
entity2 b = entity.b;
entity2.c = entity.c;
entity2.d = entity.d;
这样得到的拷贝对象是一种浅拷贝,因为这样直接赋值的结果是对于对象属性,两个对象entity和entity2中对应的属性还是指向同一块内存区域,二者并非
真正独立。如此若要对其中的属性进行改变,则会同时影响这两个对象。
即使对对象属性进行重新new出新空间,重新按元素赋值,也不能保证属性对象中的属性也是对象,这样层层推进,操作起来很是不便。
深拷贝
要实现深拷贝,除了逐层赋值之外,还有一种比较简单直观的方式即序列化。序列化将内存对象以文件的形式保存在磁盘,若要重新恢复到内存,需要重新
开辟内存,这样两个对象就会实现完全独立,互不影响,但是需要对不能序列化的字段进行单独处理。