97色伦色在线综合视频,无玛专区,18videosex性欧美黑色,日韩黄色电影免费在线观看,国产精品伦理一区二区三区,在线视频欧美日韩,亚洲欧美在线中文字幕不卡

多語(yǔ)言網(wǎng)站建設(shè)平臺(tái)代理河北華宇建設(shè)集團(tuán)有限公司網(wǎng)站

鶴壁市浩天電氣有限公司 2026/01/24 12:27:18
多語(yǔ)言網(wǎng)站建設(shè)平臺(tái)代理,河北華宇建設(shè)集團(tuán)有限公司網(wǎng)站,互聯(lián)網(wǎng)推廣招聘,網(wǎng)站開(kāi)發(fā)處理大量用戶請(qǐng)求文章目錄前言一、 前置知識(shí)#xff1a;Java 的數(shù)據(jù)類型與對(duì)象存儲(chǔ)二、 淺拷貝#xff08;Shallow Copy#xff09;#xff1a;只拷貝 “表面”1. 淺拷貝的定義2. 淺拷貝的實(shí)現(xiàn)方式3. 淺拷貝的核心特點(diǎn)三、 深拷貝#xff08;Deep Copy#xff09;#xff1a;拷貝 “完全…文章目錄前言一、 前置知識(shí)Java 的數(shù)據(jù)類型與對(duì)象存儲(chǔ)二、 淺拷貝Shallow Copy只拷貝 “表面”1. 淺拷貝的定義2. 淺拷貝的實(shí)現(xiàn)方式3. 淺拷貝的核心特點(diǎn)三、 深拷貝Deep Copy拷貝 “完全獨(dú)立” 的對(duì)象1. 深拷貝的定義2. 深拷貝的兩種實(shí)現(xiàn)方式3. 深拷貝的核心特點(diǎn)四、 淺拷貝 vs 深拷貝核心區(qū)別對(duì)比五、 開(kāi)發(fā)中的避坑指南六、 總結(jié)前言大家好我是程序員梁白開(kāi)今天我們聊一聊Java 深拷貝與淺拷貝。在 Java 開(kāi)發(fā)中對(duì)象復(fù)制是高頻操作。你是否遇到過(guò) “修改新對(duì)象原對(duì)象也跟著變” 的詭異情況是否在clone()方法上踩過(guò)無(wú)數(shù)坑這些問(wèn)題的根源都在于沒(méi)分清淺拷貝Shallow Copy和深拷貝Deep Copy的本質(zhì)區(qū)別一、 前置知識(shí)Java 的數(shù)據(jù)類型與對(duì)象存儲(chǔ)要搞懂深淺拷貝必須先明白 Java 中數(shù)據(jù)的存儲(chǔ)邏輯這是一切的基礎(chǔ)Java 中的數(shù)據(jù)類型分為兩類基本數(shù)據(jù)類型byte、short、int、long、float、double、char、boolean存儲(chǔ)位置直接存儲(chǔ)在棧內(nèi)存中變量保存的是值本身。賦值邏輯賦值時(shí)直接拷貝值新舊變量互不影響。引用數(shù)據(jù)類型類、接口、數(shù)組存儲(chǔ)位置對(duì)象本身存在堆內(nèi)存變量保存的是堆內(nèi)存的地址引用。賦值邏輯賦值時(shí)拷貝的是地址引用新舊變量指向同一個(gè)堆內(nèi)存對(duì)象。舉個(gè)簡(jiǎn)單的賦值例子// 基本數(shù)據(jù)類型賦值inta10;intba;b20;System.out.println(a);// 輸出10a不受b影響// 引用數(shù)據(jù)類型賦值Useruser1newUser(張三,20);Useruser2user1;// 拷貝的是引用地址user2.setName(李四);System.out.println(user1.getName());// 輸出李四原對(duì)象被修改二、 淺拷貝Shallow Copy只拷貝 “表面”1. 淺拷貝的定義淺拷貝是指創(chuàng)建一個(gè)新對(duì)象新對(duì)象的基本數(shù)據(jù)類型成員變量會(huì)拷貝原對(duì)象的值但引用數(shù)據(jù)類型成員變量拷貝的是原對(duì)象的地址引用。簡(jiǎn)單說(shuō)淺拷貝只拷貝 “第一層”引用類型成員變量還是共用同一個(gè)堆對(duì)象。2. 淺拷貝的實(shí)現(xiàn)方式Java 中實(shí)現(xiàn)淺拷貝有兩種常見(jiàn)方式方式 1手動(dòng) new 對(duì)象逐個(gè)賦值方式 2實(shí)現(xiàn)Cloneable接口重寫(xiě)clone()方法默認(rèn)淺拷貝、方式 1手動(dòng)淺拷貝手動(dòng)創(chuàng)建新對(duì)象將原對(duì)象的成員變量逐個(gè)賦值引用類型變量直接賦值地址。// 用戶類classUser{privateStringname;// 引用類型privateintage;// 基本類型// 構(gòu)造器、getter、setter省略}// 手動(dòng)淺拷貝publicclassShallowCopyDemo{publicstaticvoidmain(String[]args){Useruser1newUser(張三,20);// 手動(dòng)淺拷貝Useruser2newUser();user2.setName(user1.getName());user2.setAge(user1.getAge());// 修改基本類型user2.setAge(25);System.out.println(user1.getAge());// 輸出20不受影響// 修改引用類型String是不可變類這里換個(gè)例子更直觀// 我們換一個(gè)自定義引用類型成員變量演示比如給User加一個(gè)Address屬性}}方式 2實(shí)現(xiàn)Cloneable接口推薦Java 中Object類提供了clone()方法但它是protected修飾的且默認(rèn)是淺拷貝。要使用該方法需要實(shí)現(xiàn)Cloneable標(biāo)記接口沒(méi)有任何方法僅作標(biāo)記重寫(xiě)clone()方法修改訪問(wèn)權(quán)限為public我們給User類增加一個(gè)引用類型成員變量Address更直觀地看淺拷貝的問(wèn)題// 地址類引用類型classAddress{privateStringcity;// 構(gòu)造器、getter、setter省略publicAddress(Stringcity){this.citycity;}}// 用戶類實(shí)現(xiàn)Cloneable接口classUserimplementsCloneable{privateStringname;// 引用類型privateintage;// 基本類型privateAddressaddr;// 自定義引用類型// 構(gòu)造器、getter、setter省略publicUser(Stringname,intage,Addressaddr){this.namename;this.ageage;this.addraddr;}// 重寫(xiě)clone方法默認(rèn)淺拷貝OverridepublicObjectclone()throwsCloneNotSupportedException{returnsuper.clone();}}// 測(cè)試淺拷貝publicclassShallowCopyTest{publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{AddressaddrnewAddress(北京);Useruser1newUser(張三,20,addr);// 淺拷貝Useruser2(User)user1.clone();// 1. 修改基本類型成員變量user2.setAge(25);System.out.println(user1.getAge());// 輸出20不受影響// 2. 修改引用類型成員變量核心坑點(diǎn)user2.getAddr().setCity(上海);System.out.println(user1.getAddr().getCity());// 輸出上海原對(duì)象被修改}}3. 淺拷貝的核心特點(diǎn)優(yōu)點(diǎn)實(shí)現(xiàn)簡(jiǎn)單拷貝效率高。缺點(diǎn)引用類型成員變量共享堆內(nèi)存修改新對(duì)象的引用成員會(huì)影響原對(duì)象存在數(shù)據(jù)安全風(fēng)險(xiǎn)。三、 深拷貝Deep Copy拷貝 “完全獨(dú)立” 的對(duì)象1. 深拷貝的定義深拷貝是指創(chuàng)建一個(gè)新對(duì)象不僅拷貝原對(duì)象的基本數(shù)據(jù)類型成員變量值還會(huì)為引用數(shù)據(jù)類型成員變量重新創(chuàng)建一個(gè)獨(dú)立的新對(duì)象。簡(jiǎn)單說(shuō)深拷貝會(huì)拷貝 “所有層級(jí)”新對(duì)象和原對(duì)象完全獨(dú)立修改任何一方都不會(huì)影響另一方。2. 深拷貝的兩種實(shí)現(xiàn)方式深拷貝的實(shí)現(xiàn)比淺拷貝復(fù)雜常見(jiàn)的有兩種方式方式 1嵌套重寫(xiě)clone()方法適用于自定義類較少的場(chǎng)景方式 2序列化與反序列化通用推薦適用于復(fù)雜對(duì)象方式 1嵌套重寫(xiě)clone()方法思路不僅要讓外層類實(shí)現(xiàn)Cloneable其所有引用類型成員變量對(duì)應(yīng)的類也需要實(shí)現(xiàn)Cloneable并重寫(xiě)clone()方法然后在外層類的clone()方法中手動(dòng)拷貝引用成員。// 地址類實(shí)現(xiàn)Cloneable接口classAddressimplementsCloneable{privateStringcity;publicAddress(Stringcity){this.citycity;}// getter、setter省略// 地址類重寫(xiě)clone方法OverridepublicObjectclone()throwsCloneNotSupportedException{returnsuper.clone();}}// 用戶類classUserimplementsCloneable{privateStringname;privateintage;privateAddressaddr;// 構(gòu)造器、getter、setter省略// 重寫(xiě)clone方法實(shí)現(xiàn)深拷貝OverridepublicObjectclone()throwsCloneNotSupportedException{// 1. 先拷貝外層對(duì)象淺拷貝Useruser(User)super.clone();// 2. 再手動(dòng)拷貝引用類型成員變量關(guān)鍵步驟user.addr(Address)this.addr.clone();returnuser;}}// 測(cè)試深拷貝publicclassDeepCopyTest{publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{AddressaddrnewAddress(北京);Useruser1newUser(張三,20,addr);Useruser2(User)user1.clone();// 修改新對(duì)象的引用成員變量user2.getAddr().setCity(上海);// 原對(duì)象不受影響System.out.println(user1.getAddr().getCity());// 輸出北京}}方式 2序列化與反序列化推薦思路將對(duì)象序列化為字節(jié)流再?gòu)淖止?jié)流反序列化為新對(duì)象這個(gè)過(guò)程會(huì)自動(dòng)創(chuàng)建一個(gè)完全獨(dú)立的新對(duì)象。注意所有涉及的類都需要實(shí)現(xiàn)Serializable標(biāo)記接口否則會(huì)拋出序列化異常。importjava.io.*;// 地址類實(shí)現(xiàn)SerializableclassAddressimplementsSerializable{privatestaticfinallongserialVersionUID1L;// 序列化版本號(hào)privateStringcity;// 構(gòu)造器、getter、setter省略}// 用戶類實(shí)現(xiàn)SerializableclassUserimplementsSerializable{privatestaticfinallongserialVersionUID1L;privateStringname;privateintage;privateAddressaddr;// 構(gòu)造器、getter、setter省略// 深拷貝工具方法publicUserdeepCopy()throwsIOException,ClassNotFoundException{// 1. 序列化將對(duì)象寫(xiě)入字節(jié)流ByteArrayOutputStreambosnewByteArrayOutputStream();ObjectOutputStreamoosnewObjectOutputStream(bos);oos.writeObject(this);// 2. 反序列化從字節(jié)流讀取新對(duì)象ByteArrayInputStreambisnewByteArrayInputStream(bos.toByteArray());ObjectInputStreamoisnewObjectInputStream(bis);return(User)ois.readObject();}}// 測(cè)試序列化深拷貝publicclassDeepCopyBySerialize{publicstaticvoidmain(String[]args)throwsException{AddressaddrnewAddress(北京);Useruser1newUser(張三,20,addr);Useruser2user1.deepCopy();user2.getAddr().setCity(上海);System.out.println(user1.getAddr().getCity());// 輸出北京完全獨(dú)立}}3. 深拷貝的核心特點(diǎn)優(yōu)點(diǎn)新對(duì)象與原對(duì)象完全隔離數(shù)據(jù)安全不存在相互影響的問(wèn)題。缺點(diǎn)實(shí)現(xiàn)相對(duì)復(fù)雜序列化方式會(huì)有一定的性能開(kāi)銷。四、 淺拷貝 vs 深拷貝核心區(qū)別對(duì)比為了方便大家記憶我們用一張表格總結(jié)兩者的核心區(qū)別特性淺拷貝深拷貝拷貝層級(jí)僅拷貝第一層基本類型值 引用地址拷貝所有層級(jí)基本類型值 引用對(duì)象新實(shí)例引用成員變量與原對(duì)象共享同一個(gè)引用對(duì)象重新創(chuàng)建獨(dú)立的引用對(duì)象修改影響修改新對(duì)象的引用成員會(huì)影響原對(duì)象修改新對(duì)象完全不影響原對(duì)象實(shí)現(xiàn)難度簡(jiǎn)單手動(dòng)賦值或重寫(xiě) clone () 即可較復(fù)雜嵌套 clone 或序列化性能效率高開(kāi)銷小效率較低序列化有額外開(kāi)銷適用場(chǎng)景對(duì)象無(wú)引用類型成員或無(wú)需獨(dú)立引用成員對(duì)象包含多層引用類型需要完全獨(dú)立的拷貝五、 開(kāi)發(fā)中的避坑指南不要濫用clone()方法默認(rèn)是淺拷貝一定要檢查引用成員變量是否會(huì)導(dǎo)致數(shù)據(jù)安全問(wèn)題。序列化深拷貝注意事項(xiàng)所有相關(guān)類必須實(shí)現(xiàn)Serializable接口。靜態(tài)變量不會(huì)被序列化因?yàn)殪o態(tài)變量屬于類不屬于對(duì)象。transient修飾的變量不會(huì)被序列化可用于排除不需要拷貝的敏感字段。不可變類的特殊情況比如String、Integer等不可變類因?yàn)槠渲挡豢尚薷募词故菧\拷貝也不會(huì)出現(xiàn)數(shù)據(jù)聯(lián)動(dòng)問(wèn)題。六、 總結(jié)直接賦值≠拷貝引用類型賦值只是傳遞地址新舊變量指向同一對(duì)象。淺拷貝只拷貝第一層引用成員共享適合簡(jiǎn)單對(duì)象。深拷貝拷貝所有層級(jí)對(duì)象完全獨(dú)立適合復(fù)雜嵌套對(duì)象。選擇哪種拷貝方式核心看業(yè)務(wù)需求如果只是臨時(shí)使用且不需要修改引用成員淺拷貝足夠如果需要長(zhǎng)期存儲(chǔ)或修改數(shù)據(jù)一定要用深拷貝保證數(shù)據(jù)安全
版權(quán)聲明: 本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)聯(lián)系我們進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

哈爾濱建設(shè)網(wǎng)站制作網(wǎng)站建設(shè)的前期工作基礎(chǔ)

哈爾濱建設(shè)網(wǎng)站制作,網(wǎng)站建設(shè)的前期工作基礎(chǔ),大學(xué)課程免費(fèi)自學(xué)網(wǎng)站,小程序頁(yè)面設(shè)計(jì)圖片第一章#xff1a;PHP服務(wù)監(jiān)控?cái)?shù)據(jù)采集的核心價(jià)值在現(xiàn)代Web應(yīng)用運(yùn)維體系中#xff0c;PHP作為廣泛使用的服務(wù)

2026/01/23 06:02:02

餐飲企業(yè)網(wǎng)站建設(shè)wordpress 內(nèi)網(wǎng)服務(wù)器

餐飲企業(yè)網(wǎng)站建設(shè),wordpress 內(nèi)網(wǎng)服務(wù)器,保定市清苑區(qū)網(wǎng)站建設(shè),wordpress 唯艾迪編程中的算術(shù)運(yùn)算、數(shù)組及相關(guān)操作 在編程領(lǐng)域,尤其是在 shell 腳本編程中,對(duì)數(shù)字和字符串的操作

2026/01/23 17:06:02

江西建設(shè)廳網(wǎng)站女生做交互設(shè)計(jì)師好嗎

江西建設(shè)廳網(wǎng)站,女生做交互設(shè)計(jì)師好嗎,西鄉(xiāng)專業(yè)做網(wǎng)站公司,建設(shè)網(wǎng)站的分析報(bào)告如何快速掌握開(kāi)源NAND編程器#xff1a;電子工程師的完整使用指南 【免費(fèi)下載鏈接】nand_programmer NAN

2026/01/23 18:31:01

陽(yáng)江網(wǎng)站建設(shè)銀行公積金網(wǎng)站提示udun

陽(yáng)江網(wǎng)站,建設(shè)銀行公積金網(wǎng)站提示udun,安徽工程建設(shè)造價(jià)信息網(wǎng)站,留學(xué)網(wǎng)站建設(shè)開(kāi)發(fā)方案5分鐘零基礎(chǔ)實(shí)戰(zhàn)#xff1a;ChunJun分布式數(shù)據(jù)同步框架從入門到精通 【免費(fèi)下載鏈接】chunjun Ch

2026/01/23 13:05:01

墨爾本網(wǎng)站建設(shè)做網(wǎng)站建設(shè)專業(yè)定制

墨爾本網(wǎng)站建設(shè),做網(wǎng)站建設(shè)專業(yè)定制,頁(yè)面設(shè)計(jì)的英文,網(wǎng)站運(yùn)營(yíng)專員具體每天怎么做使用字符串切片#xff1a; 定義一個(gè)字符串變量#xff0c;例如 str “Runoob”。 使用切片語(yǔ)法 [::-1

2026/01/23 12:12:01