談談你對深克隆和淺克隆的理解
一個工作了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
- 使用橋接模式設計複雜的訊息系統
- 為什麼MySQL索引結構採用B 樹?
- 為什麼Netty執行緒池預設大小為CPU核數的2倍
- 談談你對深克隆和淺克隆的理解
- 什麼是代理,為什麼要用動態代理?
- 什麼是零拷貝,Netty是如何實現的?
- 3分鐘輕鬆理解單執行緒下的HashMap工作原理
- 被面試官問爛的Spring AOP原理,你是怎麼答的?
- Spring為何需要三級快取解決迴圈依賴,而不是二級快取?
- 為什麼Spring中每個Bean都要定義作用域?
- 談談你對Spring Bean的理解
- 趣談裝飾器模式,讓你一輩子不會忘
- 掌握這些招數,你也能寫出HR眼中的高分簡歷
- MongoDB高階應用之資料轉存與恢復(5)
- 圖解MongoDB叢集部署原理(3)
- 爆肝30天,肝出來史上最透徹Spring原理和27道高頻面試題總結
- Spring核心原理之IoC容器初體驗(2)
- Spring核心原理分析之MVC九大元件(1)
- 30個類手寫Spring核心原理之動態資料來源切換(8)
- 【緊急】Log4j又發新版2.17.0,只有徹底搞懂漏洞原因,才能以不變應萬變,小白也能看懂