Shallow copy & Deep copy

来源:互联网 发布:苹果手机软件更新软件 编辑:程序博客网 时间:2024/05/09 16:20

面向对象编程语言都提供了内存中对象的复制能力,Java语言提供了对象的浅拷贝和深拷贝。

浅拷贝(Shallow copy):

复制一个对象时,如果它的一个属性是引用,则复制这个引用,使之指向内存中同一对象。

深拷贝(Deep copy):

但如果为此属性创建了一个新对象,让其引用它,则是深拷贝。


实现深拷贝:使类实现java.io.Serializable接口,把原型对象序列化,然后反序列后得到的对象,其实就是一个新的深拷贝对象。

package com.alex.prototypepattern;public class DeepCopyBeanTestDrive {    public static void main(String[] args) {        DeepCopyBean originalBean = new DeepCopyBean();        //create a String object in jvm heap         originalBean.setName(new String("alex"));        //create a String object in  jvm string pool        //originalBean.setName("alex");        originalBean.setAge(24);        //clone this bean        DeepCopyBean newBean = originalBean.deepCopy();        System.out.println("Primitive field use == tocompare : " + (newBean.getAge() == originalBean.getAge()));        System.out.println("Object field  use == to compare : " + (newBean.getName() == originalBean.getName()));        System.out.println("Object field use equal to compare : " + (newBean.getName().equals(originalBean.getName())));    }}

package com.alex.prototypepattern;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;public class DeepCopyBean implements Serializable{private String name ;private int age;public String getName() {return name;}public int getAge() {return age;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public DeepCopyBean deepCopy(){ByteArrayOutputStream buf = new ByteArrayOutputStream();try {ObjectOutputStream oos = new ObjectOutputStream(buf);oos.writeObject(this);ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(buf.toByteArray()));try {return (DeepCopyBean)ois.readObject();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}}




原创粉丝点击