日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java深入理解深拷贝和浅拷贝的区别 如何实现深拷贝和浅拷贝

發(fā)布時(shí)間:2024/3/13 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java深入理解深拷贝和浅拷贝的区别 如何实现深拷贝和浅拷贝 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一、拷貝簡介
    • 1.1 引用拷貝
    • 1.2 對象拷貝
  • 二、淺拷貝
    • 2.1 定義
  • 三、深拷貝
    • 3.1 定義

一、拷貝簡介

1.1 引用拷貝

創(chuàng)建一個(gè)指向?qū)ο蟮囊米兞康目截?/strong>

public class DemoCopy {public static void main(String[] args) {// 1. 引用拷貝:創(chuàng)建一個(gè)指向?qū)ο蟮囊米兞康目截?/span>TempUser tempUser = new TempUser("張三",18);TempUser otherTempUser = tempUser;System.out.println(tempUser);System.out.println(otherTempUser);} }class TempUser{private String name;private int age;public String getName(){return name;}public void setName(String name){this.name = name;}public int getAge(){return age;}public void setAge(int age){this.age = age;}public TempUser(String name,int age){this.name = name;this.age = age;} }

輸出結(jié)果

com.TempUser@7ba4f24f com.TempUser@7ba4f24f

結(jié)果分析

  • 地址值相同,說明是同一對象
  • tempUser 和 otherTempUser 只是引用
  • 都指向了一個(gè)相同的對象,就叫做**引用拷貝
  • #mermaid-svg-U0gYXbrtDnOhQiWR {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-U0gYXbrtDnOhQiWR .error-icon{fill:#552222;}#mermaid-svg-U0gYXbrtDnOhQiWR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-U0gYXbrtDnOhQiWR .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-U0gYXbrtDnOhQiWR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-U0gYXbrtDnOhQiWR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-U0gYXbrtDnOhQiWR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-U0gYXbrtDnOhQiWR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-U0gYXbrtDnOhQiWR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-U0gYXbrtDnOhQiWR .marker.cross{stroke:#333333;}#mermaid-svg-U0gYXbrtDnOhQiWR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-U0gYXbrtDnOhQiWR .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-U0gYXbrtDnOhQiWR .cluster-label text{fill:#333;}#mermaid-svg-U0gYXbrtDnOhQiWR .cluster-label span{color:#333;}#mermaid-svg-U0gYXbrtDnOhQiWR .label text,#mermaid-svg-U0gYXbrtDnOhQiWR span{fill:#333;color:#333;}#mermaid-svg-U0gYXbrtDnOhQiWR .node rect,#mermaid-svg-U0gYXbrtDnOhQiWR .node circle,#mermaid-svg-U0gYXbrtDnOhQiWR .node ellipse,#mermaid-svg-U0gYXbrtDnOhQiWR .node polygon,#mermaid-svg-U0gYXbrtDnOhQiWR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-U0gYXbrtDnOhQiWR .node .label{text-align:center;}#mermaid-svg-U0gYXbrtDnOhQiWR .node.clickable{cursor:pointer;}#mermaid-svg-U0gYXbrtDnOhQiWR .arrowheadPath{fill:#333333;}#mermaid-svg-U0gYXbrtDnOhQiWR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-U0gYXbrtDnOhQiWR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-U0gYXbrtDnOhQiWR .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-U0gYXbrtDnOhQiWR .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-U0gYXbrtDnOhQiWR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-U0gYXbrtDnOhQiWR .cluster text{fill:#333;}#mermaid-svg-U0gYXbrtDnOhQiWR .cluster span{color:#333;}#mermaid-svg-U0gYXbrtDnOhQiWR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-U0gYXbrtDnOhQiWR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} tempUser 張三,18 otherTempUser

    1.2 對象拷貝

    public class DemoCopy {public static void main(String[] args) throws CloneNotSupportedException{// 對象拷貝TempUser tempUser = new TempUser("李四",18);TempUser otherTempUser = (TempUser) tempUser1.clone();System.out.println(tempUser);System.out.println(otherTempUser);} }class TempUser implements Cloneable {private String name;private int age;public String getName(){return name;}public void setName(String name){this.name = name;}public int getAge(){return age;}public void setAge(int age){this.age = age;}public TempUser(String name,int age){this.name = name;this.age = age;}// 重寫Clone方法,將訪問權(quán)限修改為publicpublic Object clone() throws CloneNotSupportedException {Object object = super.clone();return object;} }

    輸出結(jié)果

    com.TempUser@3b9a45b3 com.TempUser@7699a589

    結(jié)果分析

  • 地址不同,說明創(chuàng)建了新的對象
  • 不是把原對象的地址賦給了一個(gè)新的引用變量,這就叫做對象拷貝
  • #mermaid-svg-VA7niekqAOtOgXJQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-VA7niekqAOtOgXJQ .error-icon{fill:#552222;}#mermaid-svg-VA7niekqAOtOgXJQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VA7niekqAOtOgXJQ .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-VA7niekqAOtOgXJQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VA7niekqAOtOgXJQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VA7niekqAOtOgXJQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VA7niekqAOtOgXJQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VA7niekqAOtOgXJQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VA7niekqAOtOgXJQ .marker.cross{stroke:#333333;}#mermaid-svg-VA7niekqAOtOgXJQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VA7niekqAOtOgXJQ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VA7niekqAOtOgXJQ .cluster-label text{fill:#333;}#mermaid-svg-VA7niekqAOtOgXJQ .cluster-label span{color:#333;}#mermaid-svg-VA7niekqAOtOgXJQ .label text,#mermaid-svg-VA7niekqAOtOgXJQ span{fill:#333;color:#333;}#mermaid-svg-VA7niekqAOtOgXJQ .node rect,#mermaid-svg-VA7niekqAOtOgXJQ .node circle,#mermaid-svg-VA7niekqAOtOgXJQ .node ellipse,#mermaid-svg-VA7niekqAOtOgXJQ .node polygon,#mermaid-svg-VA7niekqAOtOgXJQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VA7niekqAOtOgXJQ .node .label{text-align:center;}#mermaid-svg-VA7niekqAOtOgXJQ .node.clickable{cursor:pointer;}#mermaid-svg-VA7niekqAOtOgXJQ .arrowheadPath{fill:#333333;}#mermaid-svg-VA7niekqAOtOgXJQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VA7niekqAOtOgXJQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VA7niekqAOtOgXJQ .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-VA7niekqAOtOgXJQ .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-VA7niekqAOtOgXJQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VA7niekqAOtOgXJQ .cluster text{fill:#333;}#mermaid-svg-VA7niekqAOtOgXJQ .cluster span{color:#333;}#mermaid-svg-VA7niekqAOtOgXJQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VA7niekqAOtOgXJQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} tempUser 李四,18 otherTempUser 李四,18

    二、淺拷貝

    2.1 定義

  • 被復(fù)制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象
  • 即對象的淺拷貝會(huì)對對象進(jìn)行拷貝,但不會(huì)復(fù)制主對象里面的對象
  • 里面的對象: 會(huì)在原來的對象和它的副本之間共享
  • 簡而言之,淺拷貝僅僅復(fù)制所考慮的對象,而不復(fù)制它所引用的對象
  • 淺拷貝只是增加了一個(gè)指針指向已存在的內(nèi)存地址
  • public class DemoCopy {public static void main(String[] args) throws CloneNotSupportedException{// 淺拷貝Address address = new Address();address.setCountry("大陸");address.setProvince("天斗");TempUser tempUser2 = new TempUser();tempUser2.setName("王五");tempUser2.setAge(20);tempUser2.setAddress(address);TempUser tempUser3 = (TempUser) tempUser2.clone();System.out.println(tempUser2.getName() + " | " + tempUser2.getAge() + " | " + tempUser2.getAddress().getCountry() + " | " + tempUser2.getAddress().getProvince());System.out.println(tempUser3.getName() + " | " + tempUser3.getAge() + " | " + tempUser3.getAddress().getCountry() + " | " + tempUser3.getAddress().getProvince());System.out.println("------修改地址信息后------");address.setCountry("蒼穹");address.setProvince("烏坦");System.out.println(tempUser2.getName() + " | " + tempUser2.getAge() + " | " + tempUser2.getAddress().getCountry() + " | " + tempUser2.getAddress().getProvince());System.out.println(tempUser3.getName() + " | " + tempUser3.getAge() + " | " + tempUser3.getAddress().getCountry() + " | " + tempUser3.getAddress().getProvince());} }class TempUser implements Cloneable {private String name;private int age;private Address address;public String getName(){return name;}public void setName(String name){this.name = name;}public int getAge(){return age;}public void setAge(int age){this.age = age;}public Address getAddress(){return address;}public void setAddress(Address address){this.address = address;}public TempUser(){}public TempUser(String name,int age){this.name = name;this.age = age;}public TempUser(String name,int age,Address address){this.name = name;this.age = age;this.address = address;}// 重寫Clone方法,將訪問權(quán)限修改為publicpublic Object clone() throws CloneNotSupportedException {Object object = super.clone();return object;} }class Address implements Cloneable{private String country;private String province;public String getCountry(){return country;}public void setCountry(String country){this.country = country;}public String getProvince(){return province;}public void setProvince(String province){this.province = province;}public Address(){}public Address(String country,String province){this.country = country;this.province = province;} }

    輸出結(jié)果

    王五 | 20 | 大陸 | 天斗 王五 | 20 | 大陸 | 天斗 ------修改地址信息后------ 王五 | 20 | 蒼穹 | 烏坦 王五 | 20 | 蒼穹 | 烏坦

    結(jié)果分析

  • 兩個(gè)引用 tempUser2tempUser3 指向不同的兩個(gè)對象
  • 兩個(gè)引用 tempUser2tempUser3 中的兩個(gè)address引用指向的是同一個(gè)對象,所以說明是淺拷貝
  • #mermaid-svg-BVrDtp2CwzRjaYUn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BVrDtp2CwzRjaYUn .error-icon{fill:#552222;}#mermaid-svg-BVrDtp2CwzRjaYUn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BVrDtp2CwzRjaYUn .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-BVrDtp2CwzRjaYUn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BVrDtp2CwzRjaYUn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BVrDtp2CwzRjaYUn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BVrDtp2CwzRjaYUn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BVrDtp2CwzRjaYUn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BVrDtp2CwzRjaYUn .marker.cross{stroke:#333333;}#mermaid-svg-BVrDtp2CwzRjaYUn svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BVrDtp2CwzRjaYUn .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BVrDtp2CwzRjaYUn .cluster-label text{fill:#333;}#mermaid-svg-BVrDtp2CwzRjaYUn .cluster-label span{color:#333;}#mermaid-svg-BVrDtp2CwzRjaYUn .label text,#mermaid-svg-BVrDtp2CwzRjaYUn span{fill:#333;color:#333;}#mermaid-svg-BVrDtp2CwzRjaYUn .node rect,#mermaid-svg-BVrDtp2CwzRjaYUn .node circle,#mermaid-svg-BVrDtp2CwzRjaYUn .node ellipse,#mermaid-svg-BVrDtp2CwzRjaYUn .node polygon,#mermaid-svg-BVrDtp2CwzRjaYUn .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BVrDtp2CwzRjaYUn .node .label{text-align:center;}#mermaid-svg-BVrDtp2CwzRjaYUn .node.clickable{cursor:pointer;}#mermaid-svg-BVrDtp2CwzRjaYUn .arrowheadPath{fill:#333333;}#mermaid-svg-BVrDtp2CwzRjaYUn .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BVrDtp2CwzRjaYUn .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BVrDtp2CwzRjaYUn .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-BVrDtp2CwzRjaYUn .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-BVrDtp2CwzRjaYUn .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BVrDtp2CwzRjaYUn .cluster text{fill:#333;}#mermaid-svg-BVrDtp2CwzRjaYUn .cluster span{color:#333;}#mermaid-svg-BVrDtp2CwzRjaYUn div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BVrDtp2CwzRjaYUn :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} tempUser2 王五,20 tempUser3 王五,20 address

    三、深拷貝

    3.1 定義

  • 深拷貝是一整個(gè)獨(dú)立的對象拷貝,深拷貝會(huì)拷貝所有的屬性,并拷貝屬性指向的動(dòng)態(tài)分配的內(nèi)存
  • 當(dāng)對象和它所引用的對象一起拷貝時(shí)即發(fā)生深拷貝
  • 深拷貝相比于淺拷貝速度較慢并且花銷較大
  • 簡而言之,深拷貝把要復(fù)制的對象所引用的對象都復(fù)制了一遍
  • 深拷貝是增加了一個(gè)指針并且申請了一個(gè)新的內(nèi)存,使這個(gè)增加的指針指向這個(gè)新的內(nèi)存
  • 使用深拷貝的情況下,釋放內(nèi)存的時(shí)候不會(huì)因?yàn)槌霈F(xiàn)淺拷貝時(shí)釋放同一個(gè)內(nèi)存的錯(cuò)誤
  • public class DemoCopy {public static void main(String[] args) throws CloneNotSupportedException{// 深拷貝Address address1 = new Address();address1.setCountry("遮天");address1.setProvince("天庭");TempUser tempUser4 = new TempUser();tempUser4.setName("趙六");tempUser4.setAge(18);tempUser4.setAddress(address1);TempUser tempUser5 = (TempUser) tempUser4.clone();System.out.println(tempUser4.getName() + " | " + tempUser4.getAge() + " | " + tempUser4.getAddress().getCountry() + " | " + tempUser4.getAddress().getProvince());System.out.println(tempUser5.getName() + " | " + tempUser5.getAge() + " | " + tempUser5.getAddress().getCountry() + " | " + tempUser5.getAddress().getProvince());System.out.println("------修改地址信息后------");address1.setCountry("完美");address1.setProvince("世界");System.out.println(tempUser4.getName() + " | " + tempUser4.getAge() + " | " + tempUser4.getAddress().getCountry() + " | " + tempUser4.getAddress().getProvince());System.out.println(tempUser5.getName() + " | " + tempUser5.getAge() + " | " + tempUser5.getAddress().getCountry() + " | " + tempUser5.getAddress().getProvince());} }class TempUser implements Cloneable {private String name;private int age;private Address address;public String getName(){return name;}public void setName(String name){this.name = name;}public int getAge(){return age;}public void setAge(int age){this.age = age;}public Address getAddress(){return address;}public void setAddress(Address address){this.address = address;}public TempUser(){}public TempUser(String name,int age){this.name = name;this.age = age;}public TempUser(String name,int age,Address address){this.name = name;this.age = age;this.address = address;}// 重寫Clone方法,將訪問權(quán)限修改為publicpublic Object clone() throws CloneNotSupportedException {// 淺復(fù)制/*Object object = super.clone();return object;*/// 深復(fù)制TempUser tempUser = (TempUser) super.clone();tempUser.setAddress((Address) tempUser.getAddress().clone());return tempUser;} }class Address implements Cloneable{private String country;private String province;public String getCountry(){return country;}public void setCountry(String country){this.country = country;}public String getProvince(){return province;}public void setProvince(String province){this.province = province;}public Address(){}public Address(String country,String province){this.country = country;this.province = province;}public Object clone() throws CloneNotSupportedException {// 淺復(fù)制Object object = super.clone();return object;} }

    輸出結(jié)果

    趙六 | 18 | 遮天 | 天庭 趙六 | 18 | 遮天 | 天庭 ------修改地址信息后------ 趙六 | 18 | 完美 | 世界 趙六 | 18 | 遮天 | 天庭

    結(jié)果分析

  • 兩個(gè)引用 tempUser4tempUser5 指向不同的兩個(gè)對象
  • 兩個(gè)引用 tempUser4tempUser5 中的兩個(gè) address1 引用指向的是兩個(gè)對象
  • address1 對象的修改只能影響 tempUser4 對象,所以說是深拷貝
  • 總結(jié)

    以上是生活随笔為你收集整理的java深入理解深拷贝和浅拷贝的区别 如何实现深拷贝和浅拷贝的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。