python中有深度拷贝(也可以叫深度克隆)和浅拷贝,同样在java中很多时候需要深度拷贝对象,所谓的深度拷贝对象指的就是对于对象的所用数据及其全部进行copy一份,变成两个完全不相关的对象,而浅拷贝不拷贝对象所用的数据资源等,虽是两个对象,但是用的是同一个数据对象。
下面来说明一下java中的深度拷贝,其最佳的方式就是实现Serializable接口,用序列化和反序列化来实现对象的深度拷贝,所谓的序列化和反序列化简单说明下,序列化指的就是把对象直接转化成文件或者其他持久层数据,反序列化指的就是读出该数据,应为java中的JVM虚拟机是有生命周期的,所以说任何对象的生命周期不会超过当前的JVM虚拟机的生命周期,所以需要序列化和反序列化,其中Serializable中有一个ID值,表示的就是版本号,不多废话了,下面来介绍一下java对象的深度克隆。
java中的对象的深度克隆主要的原理就是实现对象的字节流转换,然后在把当前的字节流对象输出,得到新的对象。代码:
public Object deepClone() {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();//字节流对象
ObjectOutputStream oos = new ObjectOutputStream(bos);//开始转换该对象
oos.writeObject(this);//写到当前类,当然也可以写入文件
ByteArrayInputStream bais = new ByteArrayInputStream(bos.toByteArray());//字节输出流
ObjectInputStream ois = new ObjectInputStream(bais);//输出该对象
return (Object) ois.readObject();//读出对象,实现新对象的生成
} catch (Exception e) {
System.out.println("克隆出错"+e.getStackTrace());
return null;
}
}
}
原理实际上非常的简单,下面来测试一下,完整的代码:
package java_test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class study implements Serializable{
private static final long serialVersionUID = 1L;
public static int arr[] = {1,2};
public static class class1 {//内部类,也是我们克隆的对象
public Object deepClone() {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bais = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return (Object) ois.readObject();
} catch (Exception e) {
System.out.println("克隆出错"+e.getStackTrace());
return null;
}
}
}
public static void main(String[] args) {//验证一下克隆前和克隆后是不是一个对象
class1 c = new class1();
Object c2 = c;
if (c == c2){
System.out.println("克隆前c和出c2相等,也就是c和c2其实是一个对象!");
}else{
System.out.println("克隆前c和出c2不相等,出现理论不符合逻辑错误!");
}
c2 = c.deepClone();
if (c == c2){
System.out.println("深度克隆失败");
}else{
System.out.println("深度克隆成功");
}
}
}
结果:
本文观点来自个人理解,有不足之处请之处,希望不吝赐教。