Java实现深拷贝的两种方式:clone()和序列化

Java中实现深拷贝的两种方式是clone()和序列化。

1. clone()方法

clone()方法是Object类中定义的一个方法,它可以用来实现深拷贝。要实现深拷贝,需要在要拷贝的类中覆写Object类的clone()方法,并且在clone()方法中调用super.clone()方法来实现对象的拷贝,同时也要实现Cloneable接口,以标识该类支持clone()方法。

public class Person implements Cloneable{
    private String name;
    private int age;
    private Address address;
    
    @Override
    public Object clone() throws CloneNotSupportedException {
        Person p = (Person)super.clone();
        p.address = (Address)address.clone();
        return p;
    }
}

使用clone()方式实现深拷贝的缺点是实现起来比较复杂,而且当类中有复杂的数据结构时,需要对每一个数据结构的拷贝都要单独实现,这样会比较麻烦。

2. 序列化

序列化是一种将对象转换为字节序列的过程,可以将字节序列保存到文件或者内存中,也可以通过网络传输到另一个计算机环境中。序列化也可以用来实现深拷贝,只需要将要拷贝的对象进行序列化,将序列化的字节序列保存到字节数组中,再将字节数组反序列化成对象即可。

public static Object deepClone(Object obj) throws IOException, ClassNotFoundException {
    // 将对象序列化成字节数组
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(obj);
    oos.close();
    // 将字节数组反序列化成对象
    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
    ObjectInputStream ois = new ObjectInputStream(bais);
    Object cloneObj = ois.readObject();
    ois.close();
    return cloneObj;
}

使用序列化方式实现深拷贝的优点是实现起来比较简单,只需要将要拷贝的对象进行序列化和反序列化即可,而且不管要拷贝的对象有多复杂,都可以通过序列化实现深拷贝。

本文链接:http://task.lmcjl.com/news/8109.html

展开阅读全文