談談你對深克隆和淺克隆的理解

語言: CN / TW / HK

一個工作了5年的程式設計師私信我說,前幾天去阿里面試被問到這樣一個這樣的面試題,說談談你對深克隆和淺克隆的理解。他回答說深克隆是克隆值,淺克隆是克隆引用,當時他只說了這樣一句話,回答完以後,他看到面試官的表情很詫異,面試也沒有繼續深入追問了。小夥伴們,如果是你來回答,你也會這樣回回答嗎?

這位小夥伴的回答並沒有錯,只是面試官覺得回答得有點抽象而已。今天,我給大家詳細聊一聊。

另外,我花了1個多星期把往期的面試題解析配套文件準備好了,想獲取的小夥伴可以看我的煮葉簡介!

說到克隆啊,我還不得不說到一個設計模式,原型模式。先來看原型模式的定義。

1、原型模式定義

原型模式的官方原文是這樣的:

大致意思是,指原型例項指定建立物件的種類,並且通過複製這些原型建立新的物件。其實複製、克隆、拷貝表達的都是同一個意思。因為Java中的資料型別分為引用型別和值型別,因此,在克隆資料的過程中,就有了深克隆和淺克隆。

2、深克隆和淺克隆

那麼,深克隆和淺克隆的本質區別又是什麼呢?我歸納為以下兩點:

第1點:看資料拷貝後兩者之間是否有關聯。

第2點:改變一個值是否會影響到另一個值變化。

那麼,到底什麼是深克隆,什麼是淺克隆呢?

先來看淺克隆,淺克隆就是資料拷貝後,一方資料變化另一方會跟著變化。

如圖所示:有原型物件Object,它是引用型別,然後拷貝後產生兩個克隆物件obj1和obj2,只是它們克隆的是Object的記憶體地址,因此ob1和obj2都指向Object,那麼Object中的成員變數值發生改變時,obj1和obj2指向的成員變數值也就會發生改變。

實現淺克隆的常用API有以下3種,

1、工具類BeanUtils和PropertyUtils,BeanUtils是Spring提供的,PropertyUtils是Apache的commons包中提供的。

2、實現Clonenable介面

3、Arrays的copyOf()方法

下面來看深克隆,深克隆就是資料拷貝後,原型物件和克隆物件之間沒有關聯。如圖所示:obj1和obj2分別指向不同的原型物件,拷貝的是值不是記憶體地址。

 

深克隆常用的API有以下5種:

1、重寫clone()方法

2、序列化

3、Apache commons工具包中的SerializationUtils的clone()方法

4、JSON工具類

5、通過構造方法手動new物件。

以上就是我對淺克隆和深克隆的理解。

我是被程式設計耽誤的文藝Tom,如果我的分享對你有幫助,關注我的煮葉,面試不再難!

本文為“Tom彈架構”原創,轉載請註明出處。技術在於分享,我分享我快樂!\ 如果本文對您有幫助,歡迎關注和點贊;如果您有任何建議也可留言評論或私信,您的支援是我堅持創作的動力。 關注微信公眾號『 Tom彈架構 』回覆“666”可獲取200頁的PDF面試文件!

我是被程式設計耽誤的文藝Tom