深拷贝集合与浅拷贝集合android,2019-06-13:Java 中深拷贝与浅拷贝的区别?

浅拷贝:

1.实现Cloneable

2.成员变量是基本数据类型,也包括String类型

public class ShallowCopy implements Cloneable {

private int age;

private String name;

public ShallowCopy(int age, String name) {

this.age = age;

this.name = name;

}

@Override

public Object clone() {

ShallowCopy s = null;

try {

s = (ShallowCopy) super.clone();

} catch (CloneNotSupportedException e) {

e.printStackTrace();

}

return s;

}

@Override

public String toString() {

return "{" +

"age=" + age +

", name='" + name + '\'' +

'}';

}

public static void main(String[] args) {

ShallowCopy sample = new ShallowCopy(1, "wislie");

ShallowCopy cloneObj = (ShallowCopy) sample.clone();

System.out.println("浅度拷贝 (cloneObj == sample):" + (cloneObj == sample)); //false

System.out.println("sample:" + sample); //sample:{age=1, name='wislie'}

System.out.println("cloneObj:" + cloneObj); //cloneObj:{age=1, name='wislie'}

}

}

深拷贝:

有两种实现方式,一种是实现Cloneable,成员变量需要有引用类型的对象;另一种实现了Serializable,对成员变量没有限制.

实现Cloneable的方式:

public class DeepCopy implements Cloneable {

private String value;

private ShallowCopy shaderCopy;

public DeepCopy(String value, ShallowCopy shaderCopy) {

this.value = value;

this.shaderCopy = shaderCopy;

}

public String getValue() {

return value;

}

public void setValue(String value) {

this.value = value;

}

public ShallowCopy getShaderCopy() {

return shaderCopy;

}

public void setShaderCopy(ShallowCopy shaderCopy) {

this.shaderCopy = shaderCopy;

}

@Override

protected Object clone() {

DeepCopy d = null;

try {

d = (DeepCopy) super.clone();

if(shaderCopy != null){

d.setShaderCopy((ShallowCopy) shaderCopy.clone());

}

} catch (CloneNotSupportedException e) {

e.printStackTrace();

}

return d;

}

@Override

public String toString() {

return "{" +

"value='" + value + '\'' +

", shaderCopy=" + shaderCopy +

'}';

}

public static void main(String[] args) {

DeepCopy sample = new DeepCopy("high", new ShallowCopy(12, "wislie"));

DeepCopy cloneObj = (DeepCopy) sample.clone();

System.out.println("深度拷贝 (cloneObj == sample):" + (cloneObj == sample)); //false

System.out.println("sample:" + sample); //{value='high', shaderCopy={age=12, name='wislie'}}

System.out.println("cloneObj:" + cloneObj);//{value='high', shaderCopy={age=12, name='wislie'}}

}

}

实现Serializable的方式

public class DeepCopy2 implements Serializable {

private static final long serialVersionUID = 369285298572961L; //最好是显式声明ID

private int len;

private Inner inner;

public DeepCopy2(int len, Inner inner) {

this.len = len;

this.inner = inner;

}

static class Inner implements Serializable {

private static final long serialVersionUID = 369285298572941L; //最好是显式声明ID

private String color;

private int alpha;

public Inner(String color, int alpha) {

this.color = color;

this.alpha = alpha;

}

@Override

public String toString() {

return "Inner{" +

"color='" + color + '\'' +

", alpha=" + alpha +

'}';

}

}

@Override

public String toString() {

return "DeepCopy2{" +

"len=" + len +

", inner=" + inner +

'}';

}

private DeepCopy2 deepClone() {

DeepCopy2 data = null;

ByteArrayOutputStream baos = new ByteArrayOutputStream();

try {

ObjectOutputStream oos = new ObjectOutputStream(baos);

oos.writeObject(this);

//将流序列化成对象

ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());

ObjectInputStream ois = new ObjectInputStream(bais);

data = (DeepCopy2) ois.readObject();

} catch (IOException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

return data;

}

public static void main(String[] args) {

DeepCopy2 sample = new DeepCopy2(10, new Inner("blue", 255));

DeepCopy2 copySample = sample.deepClone();

System.out.println("sample==copySample:" + (sample == copySample)); //false

System.out.println("sample:" + sample); //DeepCopy2{len=10, inner=Inner{color='blue', alpha=255}}

System.out.println("copySample:" + copySample); //DeepCopy2{len=10, inner=Inner{color='blue', alpha=255}}

}

}

不管是浅拷贝还是深拷贝,对象的地址都变了;如果我说的有问题,欢迎指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值