深拷貝與淺拷貝的理解

深拷貝和淺拷貝是復制對象時的兩種不同方式,它們之間的區別在于它們如何處理對象的引用類型成員。

淺拷貝(Shallow Copy)

淺拷貝是指創建一個新對象,這個新對象是對原對象的字段的一個精確副本。對于字段中的基本數據類型,淺拷貝會復制其值;但對于引用數據類型(如對象、數組),淺拷貝僅復制引用,即新對象的引用字段指向原對象中相同的對象。

特點
  1. 基本數據類型:復制值。
  2. 引用數據類型:復制引用,指向相同的內存地址。
示例
class Address {String city;Address(String city) {this.city = city;}
}class Person implements Cloneable {String name;int age;Address address;Person(String name, int age, Address address) {this.name = name;this.age = age;this.address = address;}// 實現淺拷貝@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}public class Main {public static void main(String[] args) throws CloneNotSupportedException {Address address = new Address("New York");Person person1 = new Person("John", 30, address);Person person2 = (Person) person1.clone();System.out.println(person1.address.city); // 輸出: New YorkSystem.out.println(person2.address.city); // 輸出: New Yorkperson2.address.city = "San Francisco";System.out.println(person1.address.city); // 輸出: San FranciscoSystem.out.println(person2.address.city); // 輸出: San Francisco}
}

在上面的示例中,person2是通過淺拷貝創建的,因此它和person1共享同一個Address對象。當我們修改person2addresscity時,person1addresscity也會被修改。

深拷貝(Deep Copy)

深拷貝是指創建一個新對象,同時遞歸地復制所有引用類型的成員對象,確保新對象的每一個引用類型成員都有自己的獨立副本。

特點
  1. 基本數據類型:復制值。
  2. 引用數據類型:復制引用所指向的對象,創建獨立的副本。
示例
class Address implements Cloneable {String city;Address(String city) {this.city = city;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}class Person implements Cloneable {String name;int age;Address address;Person(String name, int age, Address address) {this.name = name;this.age = age;this.address = address;}// 實現深拷貝@Overrideprotected Object clone() throws CloneNotSupportedException {Person cloned = (Person) super.clone();cloned.address = (Address) address.clone();return cloned;}
}public class Main {public static void main(String[] args) throws CloneNotSupportedException {Address address = new Address("New York");Person person1 = new Person("John", 30, address);Person person2 = (Person) person1.clone();System.out.println(person1.address.city); // 輸出: New YorkSystem.out.println(person2.address.city); // 輸出: New Yorkperson2.address.city = "San Francisco";System.out.println(person1.address.city); // 輸出: New YorkSystem.out.println(person2.address.city); // 輸出: San Francisco}
}

在上面的示例中,person2是通過深拷貝創建的,它和person1有自己的獨立Address對象。當我們修改person2addresscity時,person1addresscity不會受到影響。

主要區別

  1. 復制內容

    • 淺拷貝:復制對象的基本類型數據和引用類型數據的引用。
    • 深拷貝:復制對象的基本類型數據和引用類型數據所指向的對象。
  2. 內存地址

    • 淺拷貝:新對象中的引用類型成員和原對象中的引用類型成員指向同一個內存地址。
    • 深拷貝:新對象中的引用類型成員和原對象中的引用類型成員指向不同的內存地址(即獨立的副本)。
  3. 實現復雜度

    • 淺拷貝:相對簡單,通過調用Object類的clone方法可以實現。
    • 深拷貝:較為復雜,需要對每個引用類型成員遞歸地調用clone方法,確保所有引用類型成員都得到深度復制。

適用場景

  • 淺拷貝適用于對象中大部分成員是基本數據類型,或者引用類型成員是不可變對象的情況。
  • 深拷貝適用于對象中包含很多引用類型成員且這些成員需要獨立的副本的情況。

理解和正確使用淺拷貝和深拷貝,對于確保程序的正確性和避免意外副作用非常重要。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35739.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35739.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35739.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C#】找不到屬性集方法。get只讀屬性用了反射設置setValue肯定報錯

歡迎來到《小5講堂》 這是《C#》系列文章,每篇文章將以博主理解的角度展開講解。 溫馨提示:博主能力有限,理解水平有限,若有不對之處望指正! 背景 找不到屬性集方法。get只讀屬性用了反射設置setValue肯定報錯 報錯…

IPFoxy Tips:匿名海外代理IP的使用方法及注意事項

在互聯網上,隱私和安全問題一直備受關注。為了保護個人隱私和數據安全,使用匿名代理IP是一種常用的方法。匿名代理IP可以隱藏用戶的真實IP地址,使用戶在訪問網站時更加隱秘和安全。 本文將介紹匿名代理IP的基本原理和核心功能。 基本原則 匿…

2024期權交易傭金手續費最低是多少?期權交易有哪些成本?

顯性成本 期權交易的顯性成本包含期權交易的傭金和交易所費用,分別支付給券商和交易所,統一由券商代收。 傭金 期權傭金是期權交易時支付給券商的費用,傭金通常以交易金額的一定比例計算,可以是固定費用,也可以是滑…

用兩個鐘,我又在VMWARE上搞了一套內部網配置

最近要學es,所以打算自己用虛擬機搞個NAT,又搞了兩個鐘。為了不再費勁嘗試,也為了造福大眾,所以選擇搞一份NAT筆記!!!! 1.初始化網關和DNS 我們給網關配置一個地址192.168.96.1&…

【多模態】BEiT v2

鏈接:https://arxiv.org/pdf/2208.06366 論文:BEIT V2: Masked Image Modeling with Vector-Quantized Visual Tokenizers Introduction Motivation:Masked image modeling (MIM) 任務在自監督表征學習上取得了不錯的成績,但是現…

教師資格證考試面試報名流程

文章目錄 前言面試報名流程一、登錄官網二、選擇報考省份三、注冊報名賬號四、確認考試承諾五、填報個人信息六、上傳個人照片七、查看個人信息八、面試報名九、等待審核十、考試繳費最后(必看)附錄1. 中小學教師資格考試網2. 廣東省教資考試報名通知&am…

Linux加固-權限管理_chattr之i和a參數

一、參數i i:如果對文件設置了i屬性,不允許對文件進行刪除、改名,也不能添加和修改數據;如果對目錄設置了i屬性,那么只能修改目錄下文件的數據,但不允許建立和刪除文件。(相當于把文件給鎖住了,…

【Mysql】多表、外鍵約束

多表 1.1 多表簡述 實際開發中,一個項目通常需要很多張表才能完成。 例如一個商城項目的數據庫,需要有很多張表:用戶表、分類表、商品表、訂單表… 1.2 單表的缺點 1.2.1 數據準備 創建一個數據庫 db3 CREATE DATABASE db3 CHARACTER SET utf8;數據庫…

Segment any Text:優質文本分割是高質量RAG的必由之路

AI應用開發相關目錄 本專欄包括AI應用開發相關內容分享,包括不限于AI算法部署實施細節、AI應用后端分析服務相關概念及開發技巧、AI應用后端應用服務相關概念及開發技巧、AI應用前端實現路徑及開發技巧 適用于具備一定算法及Python使用基礎的人群 AI應用開發流程概…

基于qemu_v8 + optee400構建自定義app

構建基于libckteec的tls安全通信應用程序,應用目錄結構 $ tree -L 2 . ├── libp11 │ ├── libp11-libp11-0.4.12 │ ├── mk_optee_three_part.sh │ └── out ├── openssl │ ├── mk_optee_three_part.sh │ ├── openssl-1.1.1w │ …

vue項目中封裝element分頁組件

我們都知道封裝組件是為了方便在項目中使用,全局封裝之后哪個模塊使用直接復制就行了,分頁在后臺項目中用到的地方也是很多的,所以我們就全局封裝一下分頁組件,以后也方便在項目中使用,接下來封裝的這個分頁也是elemen…

clean code-代碼整潔之道 閱讀筆記(第十四章)

第十四章 逐步改進——對一個命令行參數解析程序的案例研究 ps:本章設計代碼示例所以篇幅會較長,推薦直接看原文,思路、代碼講解的很清楚 本章示例:解析命令行參數的工具 —— Args Args的簡單用法 public static void main(Stri…

vue中動態綁定樣式名的方式有幾種?

在Vue中可以使用動態綁定樣式名的方式有幾種,具體取決于你的需求和使用的場景。 使用對象語法: 可以通過在data中定義一個變量,然后在模板中使用對象語法來動態綁定樣式名。 <template><div :class="{ active: isActive }">Hello Vue!</div> &l…

網絡文化經營許可證(文網文)辦理全面講解

隨著互聯網時代的飛速發展&#xff0c;互聯網早已滲透到人們的生活中&#xff0c;各類直播、短視頻成為大家生活娛樂必不可少的一部分。注冊一家從事互聯網行業的企業是一個不錯的選擇。那互聯網企業需要辦理什么證件資質呢&#xff1f;在互聯網行業從事盈利文化活動必須持有網…

【精品方案】智能制造之路(93頁PPT)

引言&#xff1a;智能制造之路&#xff1a;革新制造業的引領之旅 隨著科技的迅猛發展&#xff0c;特別是人工智能、物聯網、大數據等技術的不斷進步&#xff0c;制造業正迎來一場深刻的變革。智能制造&#xff0c;作為這場變革的核心&#xff0c;正逐步成為推動產業升級和轉型發…

MySQL為什么不建議使用多表JOIN

一、典型回答 之所以不建議使用JOIN查詢&#xff0c;最主要的原因就是JOIN的效率比較低。 MySQL是使用了嵌套循環&#xff08;Nested-Loop Join&#xff09;的方式實現關聯查詢的&#xff0c;簡單點說就是要通過兩層循環&#xff0c;用第一張表做外循環&#xff0c;第二張表做內…

大模型課程資料-全網最火29套全棧大模型項目實踐

29套AI全棧大模型項目實戰&#xff0c;人工智能視頻課程-多模態大模型&#xff0c;微調技術訓練營&#xff0c;大模型多場景實戰&#xff0c;AI圖像處理&#xff0c;AI量化投資&#xff0c;OPenCV視覺處理&#xff0c;機器學習&#xff0c;Pytorch深度學習&#xff0c;推薦系統…

【LLM】一分鐘帶你了解Agent工作流四范式

文章目錄 1. 大模型直接生成-generation2. 大模型充當工具使用-tool3. 大模型執行思維鏈-Planning4. 多大模型Agent合作-multiagent collaboration 1. 大模型直接生成-generation 通過提示詞&#xff0c;大模型直接生成想要的結果&#xff1a; 2. 大模型充當工具使用-tool …

無人機在農業方面應用的局限性

無人機在農業方面的應用雖然帶來了許多便利和效率提升&#xff0c;但也存在一些局限性。以下是對這些局限性的清晰歸納和分點表示&#xff1a; 飛行受限&#xff1a; 無人機在飛行過程中受到一定限制&#xff0c;例如在森林、城市等復雜地形或建筑物密集區域&#xff0c;其空間…

擁抱數字化未來,如何以費控驅動業務發展?

管理費用是企業運營中僅次于人力成本的第二大可控成本&#xff0c;一般會占到企業年度收入的5%—10%&#xff0c;但多數企業存在費用疏于管理、費用管理制度流于紙面難落地、費用浪費嚴重等問題。 如果不進行科學管理&#xff0c;有專家表示&#xff0c;估計企業每年至少有10%的…