Java中的“淺複製”與“深複製”,讀完之後,大部分程序員收藏了.


Java中的“淺複製”與“深複製”,讀完之後,大部分程序員收藏了.

複製

將一個對象的引用複製給另一個對象,一共有三種方式。第一種方式是直接賦值,第二種方式是淺複製,第三種方式是深複製。

1.直接賦值

在Java中,A a1 = a2,這實際上覆制的是引用,也就是說 a1 和 a2指向的是同一個對象。因此,當a1變化時,a2裡面的成員變量也會跟著變化。

2.淺複製(複製引用但不復制引用的對象)

淺複製,又稱為淺拷貝。創建一個新對象,然後將當前對象非靜態字段複製到該新對象,如果字段是值類型的,那麼對該字段執行復制;如果該字段時引用類型的話,則複製引用但不復制引用的對象。因此,原始對象及其副本引用同一個對象。

 1 class Resume implements Cloneable{ 
 2 public Object clone() { 
 3 try { 
 4 return (Resume)super.clone(); 
 5 } catch (Exception e) { 
 6 e.printStackTrace(); 
 7 return null; 
 8 } 
 9 } 
10 } 

3.深複製(複製對象和其引用對象)

又稱深拷貝,不僅複製對象本身,而且複製對象包含的引用指向的所有對象。

 1 class Student implements Cloneable {
 2 String name;
 3 int age;
 4 Professor p;
 5 Student(String name, int age, Professor p) {
 6 this.name = name;
 7 this.age = age;
 8 this.p = p;
 9 }
10 public Object clone() {
11 Student o = null;
12 try {
13 o = (Student) super.clone();
14 } catch (CloneNotSupportedException e) {
15 System.out.println(e.toString());
16 }
17 o.p = (Professor) p.clone();
18 return o;
19 }
20 }

使用clone()方法克隆一個對象的步驟:

1)被克隆的類要實現Cloneable接口。

2)被克隆的類要重寫clone()方法。

那麼在編程時,如何選擇使用哪種複製方式呢?首先,檢查類有無非基本類型(即對象)的數據成員。若沒有,則返回super.clone()即可。若有,確保類中包含的所有非基本類型的成員變量都實現了深複製。

引申:淺複製與深複製的區別?

淺複製(Shallow Clone):被複制的對象的所有變量都含有與原來對象相同的值,而所有其他對象的引用仍然指向原來的對象。換而言之,淺複製僅僅複製所考慮的對象,而不復制它引用的對象。

深複製(Deep Clone):被複制對象的所有變量都含有與原來對象相同的值,除去那些引用其他對象的變量。那些引用其他對象的變量將指向被複制的新對象,而不是原有的那些被引用的對象。換而言之,深複製把複製的對象所引用的對象都複製了一遍。

擴展:

原型模式主要用於對象的複製,實現了接口(實現Cloneable接口),重寫一個方法(重寫Object類中的clone()方法),即完成了原型模式。

原型模式中的拷貝分為“淺拷貝”和“深拷貝”:

淺拷貝:對值類型的成員變量進行值的複製,對引用類型得成員變量只複製引用,不復制引用的對象。

深拷貝:對值類型的成員變量進行值的複製,對引用類型的成員變量也進行引用對象的複製。

(Object類的clone方法只會拷貝對象中的基本數據類型的值,對於數組、容器對象、引用對象等都不會拷貝,這就是淺拷貝。如果要實現深拷貝,必須將原型模式中的數組、容器對象、引用對象等另行拷貝。)

原型模式的優點:

1.如果創建新的對象比較複雜時,可以利用原型模式簡化對象的創建過程。

2.是永遠是模式創建對象比直接new一個對象在性能上要好得多,因為Object類的clone方法是一個本地方法,它直接操作內存中的二進制流,特別是複製大對象時,性能的差別非常明顯。

原型模式的使用場景:

因為以上優點,所以在需要重複地創建相似對象時可以考慮使用原型模式。比如需要在一個循環體內創建對象,假如對象創建過程比較複雜或者循環次數很多的話,使用原型模式不但可以簡化創建過程,而且可以使系統的整體性能提高很多。

關注

感謝閱讀,如果這篇文章幫助了您,歡迎 點贊收藏,關注轉發 喲。您的幫助是我們前行的動力,我們會提供更多有價值的內容給大家... 謝謝!


分享到:


相關文章: