深拷贝与浅拷贝的区别

时间:2022-11-19 19:53:21

浅层复制与深层复制

 

 1) Java

的默认复制规则是浅层复制

性能好

隔离性差

 

   

浅层复制现象

只复制第一层对象

 

 2) 

利用序列化实现深层复制

浅层复制与深层复制   
1) Java的默认复制规则是浅层复制, 性能好, 隔离性差    浅层复制现象, 只复制第一层对象   2) 利用序列化实现深层复制
浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制        深拷贝:对象,对象内部的引用均复制      为了更好的理解它们的区别我们假设有一个对象A,它包含有2对象对象A1和对象A2

浅层复制与深层复制

 

 1) Java

的默认复制规则是浅层复制

性能好

隔离性差

 

   

浅层复制现象

只复制第一层对象

 

 2) 

利用序列化实现深层复制

 

 

 

 

浅拷贝

:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复

  

    

深拷贝

:对象,对象内部的引用均复制

  

    

为了更好的理解它们的区别我们假设有一个对象

A

它包含有

2

对象对象

A1

和对象

A2 

  

    

对象

A

进行浅拷贝后,得到对象

B

但是对象

A1

A2

并没有被拷贝

 

 

    

对象

A

进行深拷贝,得到对象

B

的同时

A1

A2

连同它们的引用也被拷贝

 

 

    

在理解了深拷贝和浅拷贝后,我们来看看

Java

的深拷贝和浅拷贝实现。

java.lang.Object

clone

()方法默认是返回一个前拷贝对象。

 

因此如果要

clone

()方法实现一个深拷贝,我们必须对每个对象的

clone

()方法进行

特别实现。当对象层次复杂的时候,这样做不但困难而且浪费时

 

间和容易出现

错误,

特别有时候你不但需要深拷贝同时你也对这个对象进行浅拷贝的时候,

会发现写这个

clone

()方法真不是一个好的解决方案。

 

    

那么除了

clone

()方法,我们还可以怎么实现呢?答案是序列化,实现步

骤和思路是把要拷贝的对象输出成

byte 

array

然后再利用

ObjectInputStream

转换出新的对象。下面是代码

 

public static Object copy(Object oldObj) {    

    Object obj = null;    

    try {    

        // Write the object out to a byte array    

        ByteArrayOutputStream bos = new ByteArrayOutputStream();    

        ObjectOutputStream out = new ObjectOutputStream(bos);    

        out.writeObject(oldObj);    

        out.flush();    

        out.close();    

        // Retrieve an input stream from the byte array and read    

        // a copy of the object back in.    

        ByteArrayInputStream bis = new 

ByteArrayInputStream(bos.toByteArray());     

        ObjectInputStream in = new ObjectInputStream(bis);    

        obj = in.readObject();    

    } catch (IOException e) {    

        e.printStackTrace();    

    } catch (ClassNotFoundException cnfe) {    

        cnfe.printStackTrace();    

    }    

    return obj;    

}