Java中的深拷貝和淺拷貝

2021-09-13 03:11:55 字數 908 閱讀 1655

淺拷貝(shallow copy):①對於資料型別是基本資料型別的成員變數,淺拷貝會直接進行值傳遞,也就是將該屬性值複製乙份給新的物件。因為是兩份不同的資料,所以對其中乙個物件的該成員變數值進行修改,不會影響另乙個物件拷貝得到的資料。②對於資料型別是引用資料型別的成員變數,比如說成員變數是某個陣列、某個類的物件等,那麼淺拷貝會進行引用傳遞,也就是只是將該成員變數的引用值(記憶體位址)複製乙份給新的物件。因為實際上兩個物件的該成員變數都指向同乙個例項。在這種情況下,在乙個物件中修改該成員變數會影響到另乙個物件的該成員變數值

。具體模型如圖所示:可以看到基本資料型別的成員變數,對其值建立了新的拷貝。而引用資料型別的成員變數的例項仍然是只有乙份,兩個物件的該成員變數都指向同乙個例項。

深拷貝:首先介紹物件圖的概念。設想一下,乙個類有乙個物件,其成員變數中又有乙個物件,該物件指向另乙個物件,另乙個物件又指向另乙個物件,直到乙個確定的例項。這就形成了物件圖。那麼,對於深拷貝來說,不僅要複製物件的所有基本資料型別的成員變數值,還要為所有引用資料型別的成員變數申請儲存空間,並複製每個引用資料型別成員變數所引用的物件,直到該物件可達的所有物件。也就是說,物件進行深拷貝要對整個物件圖進行拷貝!

簡單地說,深拷貝對引用資料型別的成員變數的物件圖中所有的物件都開闢了記憶體空間;而淺拷貝只是傳遞位址指向,新的物件並沒有對引用資料型別建立記憶體空間。

深拷貝模型如圖所示:可以看到所有的成員變數都進行了複製。

因為建立記憶體空間和拷貝整個物件圖,所以深拷貝相比於淺拷貝速度較慢並且花銷較大。

java深拷貝和淺拷貝

會建立乙個新物件,這個物件有原始物件屬性的精確拷貝。屬性是基本型別及其擴充套件型別 拷貝的就是基本型別的值。如果修改原始物件中的基本型別,拷貝物件中的基本型別不變。即原始物件和拷貝物件共用同乙個引用型別或陣列。修改原始物件或拷貝物件中引用型別,另乙個也會跟著變化 通常這種情況不是我們所想要的,這就需...

java中深拷貝淺拷貝分析

淺拷貝是指拷貝物件時僅僅拷貝物件本身 包括物件中的基本變數 而不拷貝物件包含的引用指向的物件 這裡的不拷貝是指不會給生成不同的引用位址 深拷貝不僅拷貝物件本身,而且拷貝物件包含的引用指向的所有物件。舉例 物件a1中包含對b1的引用,b1中包含對c1的引用,淺拷貝a1得到a2,那麼a2中依然包含對b1...

java中的深拷貝與淺拷貝

不說太多,直接上 淺拷貝 沒有複製類的引用,只是複製了當前類,m1和m2引用的people物件相同 public class shallowcopy class manimplements cloneable public object clone catch clonenotsupportedex...