輕鬆理解java淺拷貝和深拷貝

原文比較長,我這邊精簡一下關鍵知識點,原文地址https://www.cnblogs.com/shakinghead/p/7651502.html

Java中的對象拷貝(Object Copy)指的是將一個對象的所有屬性(成員變量)拷貝到另一個有着相同類類型的對象中去。Java中的對象拷貝主要分爲:淺拷貝(Shallow Copy)、深拷貝(Deep Copy)。

首先,淺拷貝和深拷貝的概念涉及到java值傳遞,建議先看一下這篇文章《java值傳遞》。簡而言之:java中按值傳遞是傳遞的值的拷貝,按引用傳遞其實傳遞的是引用的地址值統稱java按值傳遞。

1、淺拷貝

淺拷貝相當於java值傳遞的拷貝,複製的是基本數據類型的值或者複製引用類型的引用地址(String和包裝類特殊)。

①基本數據類型,淺拷貝會直接進行值傳遞,也就是將該屬性值複製一份給新的對象。因爲是兩份不同的數據,所以對其中一個對象的該成員變量值進行修改,不會影響另一個對象拷貝得到的數據。

②引用數據類型,比如說成員變量是某個數組、某個類的對象等,那麼淺拷貝會進行引用傳遞,也就是隻是將該成員變量的引用值(內存地址)複製一份給新的對象。因爲實際上兩個對象的該成員變量都指向同一個實例。在這種情況下,在一個對象中修改該成員變量會影響到另一個對象的該成員變量值。

淺拷貝的實現方式主要有兩種:
一、通過拷貝構造方法實現淺拷貝:
拷貝構造方法指的是該類的構造方法參數爲該類的對象。使用拷貝構造方法可以很好地完成淺拷貝,直接通過一個現有的對象創建出與該對象屬性相同的新的對象。
二、通過重寫clone()方法進行淺拷貝:
注意:1、Object類雖然有這個方法,但是這個方法是受保護的(被protected修飾),所以我們無法直接使用。2、使用clone方法的類必須實現Cloneable接口,否則會拋出異常CloneNotSupportedException
結論:基本數據類型是值傳遞,所以修改值後不會影響另一個對象的該屬性值;
引用數據類型是地址傳遞(引用傳遞),所以修改值後另一個對象的該屬性值會同步被修改。(String類例外,字符串常量池

 

2、深拷貝

與淺拷貝不同點:當成員變量爲引用類型時,深拷貝對所有引用類型的屬性都開闢了新的內存空間。拷貝出的新對象的引用數據類型修改值後,被拷貝對象的屬性值不會被修改。

深拷貝的實現方式主要有兩種:

一、通過重寫clone方法來實現深拷貝
二、通過對象序列化實現深拷貝

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章