在Java中,对象的拷贝可以分为两种:浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。这两种拷贝方式的主要区别在于它们处理对象内部引用类型字段的方式。
在Java中,可以通过以下方式实现浅拷贝:
clone()
方法(前提是实现了Cloneable
接口)。示例:
class ShallowCopyExample implements Cloneable {
int value;
List<String> list;
public ShallowCopyExample(int value, List<String> list) {
this.value = value;
this.list = list;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
// 创建一个对象
ShallowCopyExample original = new ShallowCopyExample(1, new ArrayList<>(Arrays.asList("A", "B")));
// 创建一个浅拷贝
ShallowCopyExample copy = (ShallowCopyExample) original.clone();
// 修改原始对象的list
original.list.add("C");
// 输出原始对象和拷贝对象的list
System.out.println(original.list); // 输出:[A, B, C]
System.out.println(copy.list); // 输出:[A, B]
在Java中,可以通过以下方式实现深拷贝:
示例:
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class DeepCopyExample implements Serializable {
int value;
List<String> list;
public DeepCopyExample(int value, List<String> list) {
this.value = value;
this.list = list;
}
}
public class DeepCopyExampleDemo {
public static <T extends Serializable> T deepCopy(T obj) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return (T) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
throw new RuntimeException("Deep copy failed", e);
}
}
public static void main(String[] args) {
// 创建一个对象
DeepCopyExample original = new DeepCopyExample(1, new ArrayList<>(Arrays.asList("A", "B")));
// 创建一个深拷贝
DeepCopyExample copy = deepCopy(original);
// 修改原始对象的list
original.list.add("C");
// 输出原始对象和拷贝对象的list
System.out.println(original.list); // 输出:[A, B, C]
System.out.println(copy.list); // 输出:[A, B]
}
}
总结:浅拷贝只复制对象的引用,而深拷贝会递归地复制对象及其内部的所有对象。在实际应用中,根据需求选择合适的拷贝方式。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。