欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java 基础之深克隆浅克隆 博客分类: JAVA java序列反序列克隆 

程序员文章站 2024-03-26 12:07:29
...
这段时间一直在看javabean的处理,可谓是博大精深,apache的beanutil由于用到的是反射机制,和cglib的beanutil速度差了好几百倍,这不是本节博客重点,在研究bean的拷贝的时候,顺便复习了一下java里的克隆技术,这里只做克隆部分记录
(下次分享一下另外一个高效率,高配置的beanutil工具来copyproperties,在googlecode上找到一个可以通过配置xml的元和目标的框架来进行copy属性的东东,希望通过努力我可以改成annotation版本)


浅克隆:
       简单值类型的拷贝,引用类型只是用了同一份,并没有copy一份新的,所以更改时候会有影响。

深克隆:
       把简单类型和复杂类型都拷贝一份,这样更改源或目标里的引用时不会印象另一端。

代码如下:



import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Locale;


public class DeepAndShallowClone {
public static void main(String[] args) throws Exception{
	System.out.println("-------浅克隆克隆---------");
	// shallow clone
    ShallowClone sc = new ShallowClone();
    ShallowClone scCopy = (ShallowClone)sc.clone();
    
    
    System.out.println("Shallow Copy");
    System.out.println("--Before clone");
    System.out.println("sc.a=" + sc.a);
    System.out.println("sc.b=" + sc.b[0]);
    
    scCopy.a = 1;
    scCopy.b[0] = 1;
    System.out.println("--After clone");
    System.out.println("sc.a=" + sc.a);
    System.out.println("sc.b=" + sc.b[0]);
    System.out.println("scCopy.a=" + scCopy.a);
    System.out.println("scCopy.b=" + scCopy.b[0]);
	
	System.out.println("-------深克隆---------");
	 DeepClone dc = new DeepClone();
     DeepClone dcCopy = (DeepClone)dc.deepClone();
     System.out.println("--Before clone");
     System.out.println("dc.a=" + dc.a);
     System.out.println("dc.b=" + dc.b[0]);
     dcCopy.a = 1;
     dcCopy.b[0] = 1;
     
     System.out.println("Shallow Copy");
     System.out.println("--After clone");
     System.out.println("dc.a=" + dc.a);
     System.out.println("dc.b=" + dc.b[0]);
     System.out.println("dcCopy.a=" + dcCopy.a);
     System.out.println("dcCopy.b=" + dcCopy.b[0]);
}
}
class ShallowClone implements Cloneable {
    public int a;
    public int[] b;
    
    public ShallowClone() {
        a = 100;
        b = new int[] {100, 2, 3, 4, 5};
    }
    
    // 浅克隆,对于克隆后的对象,只能保证对基础类型成员的修改不会影响原对象的相应成员
    // 对类类型和数组类型的成员,只是拷贝了对象的地址,因此对克隆后对象的这些类型成员
    // 进行修改会影响原对象
    @Override
    public Object clone() {
        ShallowClone sc = null;
        try {
            sc = (ShallowClone)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return sc;
    }
}

class DeepClone implements Serializable {
    private static final long serialVersionUID = 1L;
    public int a;
    public int[] b;
    
    public DeepClone() {
        a = 100;
        b = new int[] {100, 2, 3, 4, 5};
    }
    
    // 使用ObjectInput(Output)Stream和ByteArrayInput(Output)Stream实现深克隆
    public Object deepClone() throws IOException, ClassNotFoundException {
        DeepClone dc = null;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(this);
		oos.close();
		
		System.out.println("--------->"+oos);
		System.out.println("---------->"+baos);
        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream bis = new ObjectInputStream(bais);
        dc = (DeepClone)bis.readObject();
        return dc;
    }





本节非常简单,只是做一下记录,这段代码也是copy的,记录下序列和反序列部分,以备用。