1. 程式人生 > 其它 >克隆、深拷貝與淺拷貝區別

克隆、深拷貝與淺拷貝區別

克隆、深拷貝與淺拷貝區別

1,克隆:

❀❀業務需求:保留原來的物件,但是需要一個在原來物件的資訊上進行修改點資訊的物件,需要使用到克隆技術-------clone();

(因為使用clone() 拷貝出來的物件,有自己的記憶體地址,而不是跟被拷貝物件一樣指向同一個記憶體地址。

ps:細節:物件要使用clone()方法前,物件的類需要先實現Cloneable介面

ps:▪clone() 跟 new 區別:new 完的物件沒有原來物件的已有資料資訊。

例如原來物件(學生物件:資料資訊:小紅、20、 100),而new 一個物件的話,這沒有資料。

▪另外如果是採取直接定義引用變數stu2直接執行已經存在的學生物件stu1,兩個引用指向同一個記憶體地址,影響是同步的,

不符合咱的業務需求(原來的物件不被新產生的類所影響)

程式碼:

Student stu1 = new Student(“小紅”, 20, 100);

Student stu2 = stu1;

此刻修改stu2,例如 stu2.setName(“小芳”);

則stu1、stu2的姓名都變成了小芳。

2,深拷貝與淺拷貝區別:

2-1:先搞懂 “引用物件”跟“物件引用”,根據語文的主幹理解,“引用物件”跟“物件引用”

引用物件-------主幹是物件

物件引用-------主幹是引用

“引用物件”跟“物件引用”的區別:簡單理解變成變成了物件與引用的區別

例子 Class1 A = new Class1();

我們知道物件都是new 出來的,顯然這裡的物件(引用物件)就是 new Class1();

而引用(物件引用)就是A(因為本質講,引用就是C語言的指標,指向的作用)。平時沒考察到底層原理的,通俗理解:A就是new Class1() 起的別名。

2-2:深拷貝與淺拷貝區別:

深拷貝是針對較為複雜的object型別資料

✿淺拷貝定義:被複制物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用仍然指向原來的物件。

即物件的淺拷貝會對“主”物件進行拷貝,但不會複製主物件裡面的物件。

✿深拷貝定義:深拷貝是一個整個獨立的物件拷貝,深拷貝會拷貝所有的屬性,並拷貝屬性指向的動態分配的記憶體

當物件和它所引用的物件一起拷貝時即發生深拷貝。深拷貝相比於淺拷貝速度較慢並且花銷較大。

(1)情況一:類只有基本型別的屬性,沒有物件引用屬性。

這時候只需要clone()就可以實現克隆啦(預設情況的clone()就是淺拷貝)

(2)情況二:類除了基本型別的屬性,還有物件引用屬性。

實現業務採取方式一:如果只是想剛才那樣,類實現Cloneable介面,然後類重寫clone()方法,那麼會導致兩個物件的內部的物件引用屬性又指向同一個記憶體地址。

解決1:既然內部物件引用屬性出現了之前的指向同一個記憶體地址問題?----對於內部的物件屬性的所引用的類也使用類實現介面Cloneable,重寫clone()方法來解決。

解決2:利用序列化與反序列化實現(序列化就是將物件寫到流中的過程,寫到流中的物件是原有物件的一個拷貝,而原物件仍然存在於記憶體中。通過序列化實現的拷貝不僅可以

複製物件本身,而且可以複製其引用的成員物件,因此通過序列化將物件寫到一個流中,再反序列化從流中將其讀出來,即可實現深拷貝。)這種方式才是真正意義上的的深度克隆。

2-3:深拷貝與淺拷貝區別:是否拷貝了java(引用)物件。深拷貝拷貝引用物件,而淺拷貝沒有拷貝引用物件。淺拷貝只複製指向某個物件的指標,而不復制物件本身,

新舊物件還是共享同一塊記憶體。但深拷貝會另外創造一個一模一樣的物件,新物件跟原物件不共享記憶體,修改新物件不會改到原物件。

2-4、總結:實現物件克隆有兩種方式:

1). 實現Cloneable介面並重寫Object類中的clone()方法;

2). 實現Serializable介面,通過物件的序列化和反序列化實現克隆,這種方式才是真正意義上的的深度克隆。

參考文章:https://blog.csdn.net/weixin_42857992/article/details/99338681 《序列化(Serialization)實現深拷貝》

     https://blog.csdn.net/qq_35387940/article/details/107779427

    《Java 物件的克隆Clone和必須瞭解的淺拷貝與深拷貝_默默不代表沉默-CSDN部落格

     https://segmentfault.com/a/1190000018874254《淺拷貝與深拷貝的區別》

https://zhuanlan.zhihu.com/p/165203561《面試官:問點兒基礎的,你能說說Java深拷貝和淺拷貝區別嗎》