文章目錄
一、拷貝簡介
1.1 引用拷貝
創建一個指向對象的引用變量的拷貝
public class DemoCopy {public static void main(String[] args
) {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
;}
}
輸出結果
com.TempUser@7ba4f24f
com.TempUser@7ba4f24f
結果分析
地址值相同,說明是同一對象tempUser 和 otherTempUser 只是引用都指向了一個相同的對象,就叫做**引用拷貝
#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
;}public Object clone() throws CloneNotSupportedException {Object object
= super.clone();return object
;}
}
輸出結果
com.TempUser@3b9a45b3
com.TempUser@7699a589
結果分析
地址不同,說明創建了新的對象不是把原對象的地址賦給了一個新的引用變量,這就叫做對象拷貝
#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 定義
被復制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象即對象的淺拷貝會對主對象進行拷貝,但不會復制主對象里面的對象里面的對象: 會在原來的對象和它的副本之間共享簡而言之,淺拷貝僅僅復制所考慮的對象,而不復制它所引用的對象淺拷貝只是增加了一個指針指向已存在的內存地址
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
;}public 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
;}
}
輸出結果
王五 | 20 | 大陸 | 天斗
王五 | 20 | 大陸 | 天斗
------修改地址信息后------
王五 | 20 | 蒼穹 | 烏坦
王五 | 20 | 蒼穹 | 烏坦
結果分析
兩個引用 tempUser2 和 tempUser3 指向不同的兩個對象兩個引用 tempUser2 和 tempUser3 中的兩個address引用指向的是同一個對象,所以說明是淺拷貝
#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 定義
深拷貝是一整個獨立的對象拷貝,深拷貝會拷貝所有的屬性,并拷貝屬性指向的動態分配的內存當對象和它所引用的對象一起拷貝時即發生深拷貝深拷貝相比于淺拷貝速度較慢并且花銷較大簡而言之,深拷貝把要復制的對象所引用的對象都復制了一遍深拷貝是增加了一個指針并且申請了一個新的內存,使這個增加的指針指向這個新的內存使用深拷貝的情況下,釋放內存的時候不會因為出現淺拷貝時釋放同一個內存的錯誤
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
;}public Object clone() throws CloneNotSupportedException {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 {Object object
= super.clone();return object
;}
}
輸出結果
趙六 | 18 | 遮天 | 天庭
趙六 | 18 | 遮天 | 天庭
------修改地址信息后------
趙六 | 18 | 完美 | 世界
趙六 | 18 | 遮天 | 天庭
結果分析
兩個引用 tempUser4 和 tempUser5 指向不同的兩個對象兩個引用 tempUser4 和 tempUser5 中的兩個 address1 引用指向的是兩個對象對 address1 對象的修改只能影響 tempUser4 對象,所以說是深拷貝
總結
以上是生活随笔為你收集整理的java深入理解深拷贝和浅拷贝的区别 如何实现深拷贝和浅拷贝的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。