Java如何实现深拷贝
时间: 2024-06-11 18:06:58 浏览: 166
浅谈Java中实现深拷贝的两种方式—clone() & Serialized
Java中实现深拷贝可以通过以下几种方式:
1. 实现Cloneable接口并重写clone()方法
这是Java中最基本的实现深拷贝的方法。需要实现Cloneable接口,并重写clone()方法。在重写的clone()方法中,先调用super.clone()方法获取对象的浅拷贝,然后再对对象中的引用类型递归进行深拷贝。
```
public class MyClass implements Cloneable {
private int num;
private List<String> list;
@Override
public Object clone() throws CloneNotSupportedException {
MyClass newObj = (MyClass) super.clone();
newObj.list = new ArrayList<>(this.list);
return newObj;
}
}
```
2. 使用序列化实现深拷贝
Java中的对象序列化也可以实现深拷贝。需要将对象序列化成字节流,然后再反序列化成新的对象。这种方式需要被拷贝的对象和其所有引用类型都实现Serializable接口。
```
public class MyClass implements Serializable {
private int num;
private List<String> list;
public MyClass deepClone() throws IOException, ClassNotFoundException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (MyClass) ois.readObject();
}
}
```
3. 使用第三方库实现深拷贝
Java中有一些第三方库可以实现深拷贝,比如Apache Commons BeanUtils、Spring BeanUtils、Google Gson等。这些库都提供了一些工具方法,可以方便地实现深拷贝。
例如,使用Apache Commons BeanUtils实现深拷贝:
```
public class MyClass {
private int num;
private List<String> list;
public MyClass deepClone() throws IllegalAccessException, InstantiationException, InvocationTargetException {
MyClass newObj = MyClass.class.newInstance();
BeanUtils.copyProperties(newObj, this);
newObj.list = new ArrayList<>(this.list);
return newObj;
}
}
```
阅读全文