浅拷贝和深拷贝

本文介绍两种实现深拷贝的方法:一种是通过实现Cloneable接口并重写clone方法来实现,另一种是利用Serializable接口进行序列化和反序列化实现。前者适用于基本数据类型及其实现了Cloneable接口的引用数据类型;后者适用于所有对象,但需要实现Serializable接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里主要说说实现深拷贝的两种方式:

    1、浅拷贝

        对于基本数据类型拷贝数值,对于引用数据类型拷贝引用。下面直接看代码实现:

public class CloneImp {
public static void main(String[] args) {
Dog dog = new Dog();
dog.cat.name = "旺旺";
try {
Dog cloneDog = (Dog) dog.clone();
//拷贝数据变更
cloneDog.arr[1] = 3;
cloneDog.cat.name = "柯基";
cloneDog.account = 2000;
// 输出原始数据
System.out.println(dog);
System.out.println(cloneDog);
} catch (CloneNotSupportedException e) {

e.printStackTrace();
}
}
}

class Dog implements Cloneable{ // 1. 实现Cloneable接口
//基本数据类型
int account = 1000;
//基本数据类型的数组
int[] arr = new int[] {1,2,3,4};
//引用数据类型
Cat cat = new Cat();
public Dog() {}
//2. 重写clone方法
@Override
protected Object clone() throws CloneNotSupportedException {
//基本数据类型拷贝
Dog obj = (Dog)super.clone();
//基本数据类型对应的数组
int[] temp = new int[arr.length];
System.arraycopy(arr, 0, temp, 0, arr.length);
obj.arr = temp;
//应用数据类型
obj.cat = (Cat) cat.clone();
return obj;

}


@Override
public String toString() {
StringBuilder strb = new StringBuilder();
strb.append("account = " + account + "\n");
strb.append("cat name = " + cat.name + "\n");
strb.append("arr:");
for(int i : arr)
strb.append(i + "->");
strb.append("\n");
return strb.toString();
}
}


class Cat implements Cloneable{
public String name;
public Cat() {}

@Override
protected Object clone() throws CloneNotSupportedException {

return super.clone();
};

}



输出:

account = 1000
cat name = 旺旺
arr:1->2->3->4->


account = 2000
cat name = 柯基
arr:1->3->3->4->

基本数据类型数据:值拷贝

引用数据类型数据:引用拷贝


深拷贝:

1、对于引用数据类型可以让成员对象实现cloneable接口

2、直接利用Serializable实现

public class CloneImp {
public static void main(String[] args) {
DeepCopyExample dce = new DeepCopyExample();
dce.cat.name = "旺旺";
DeepCopyExample cloneDog = (DeepCopyExample) dce.copy();
//拷贝数据变更
cloneDog.arr[1] = 3;
cloneDog.cat.name = "柯基";
cloneDog.account = 2000;
// 输出原始数据
System.out.println(dce);
System.out.println(cloneDog);
}
}

class DeepCopyExample implements Serializable{
//自动生成的serialVersionUID
private static final long serialVersionUID = 1111L;
int account = 1000;
int[] arr = {1,2,3,4};
Cat cat = new Cat();

//自定义copy方法
public DeepCopyExample copy() {
DeepCopyExample dce = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);

ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
dce = (DeepCopyExample)ois.readObject();
} catch (Exception e) {

e.printStackTrace();
}
return dce;
}
@Override
public String toString() {
StringBuilder strb = new StringBuilder();
strb.append("account = " + account + "\n");
strb.append("cat name = " + cat.name + "\n");
strb.append("arr:");
for(int i : arr)
strb.append(i + "->");
strb.append("\n");
return strb.toString();

}

class Cat implements Cloneable, Serializable{
private static final long serialVersionUID = 2222L;
public String name;
public Cat() {}

@Override
protected Object clone() throws CloneNotSupportedException {

return super.clone();
};

}

输出结果:

account = 1000
cat name = 旺旺
arr:1->2->3->4->


account = 2000
cat name = 柯基
arr:1->3->3->4->


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值