java中的淺拷貝與深拷貝
淺拷貝
實現方法:要拷貝的類,實現Cloneable接口,而後重寫clone方法,便可實現淺拷貝。java
但缺點在於,若是該類的成員包含其餘類,則其餘類並無被拷貝,只是拷貝了一個引用對象,其指向的地址和以前的對象一致,所以,修改people1的寵物信息,people的寵物信息也變了。ide
package cn.flycold.深淺拷貝.淺拷貝; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; /** * @author liyutong03 * @description * @date 2019/10/30 * Copyright (C) 2015 Meituan * All rights reserved */ public class 淺拷貝 { public static void main(String []args) throws CloneNotSupportedException{ Pet pet = Pet.builder().pAge(2).pName("包子").build(); People people = People.builder().age(23).name("lyt").pet(pet).build(); People people1 = people.clone(); System.out.println("people :" + people); System.out.println("people1:" + people1); people1.setName("zzz"); people1.setAge(19); people1.getPet().setPName("饅頭"); people1.getPet().setPAge(3); System.out.println("after change people1"); System.out.println("people :" + people); System.out.println("people1:" + people1); } } @Data @Builder @NoArgsConstructor @AllArgsConstructor class People implements Cloneable{ private int age; private String name; private Pet pet; @Override public People clone() throws CloneNotSupportedException{ return (People) super.clone(); } } @Data @Builder @NoArgsConstructor @AllArgsConstructor class Pet{ private String pName; private int pAge; }
深拷貝
咱們能夠用兩種方法實現深拷貝ui
實現Cloneable接口
對要拷貝的類,以及其引用的類,都實現Cloneable接口,並重寫clone方法。spa
注意,包含其餘類的類,須要注意clone方法的實現,須要手動調用包含的類的clone方法code
這種方法的劣勢在於,層級太多的話代碼會很麻煩。對象
實現Serializable接口
Serializable接口是用來序列化和反序列化的,咱們用輸出流將員對象序列化爲字節,在用輸入流將字節反序列化爲對象,就實現了深拷貝,好處是簡單,咱們只需在類上標註其實現 Seriablizeable接口,注意,包含的類也要標註,便可。接口
package cn.flycold.深淺拷貝.深拷貝; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.io.*; /** * @author liyutong03 * @description * @date 2019/10/30 * Copyright (C) 2015 Meituan * All rights reserved */ public class 深拷貝 { public static void main(String []args) throws Exception{ Pet pet = Pet.builder().pAge(2).pName("包子").build(); People people = People.builder().age(23).name("lyt").pet(pet).build(); // Cloneable實現深拷貝 // People people1 = people.clone(); // Serializable實現深拷貝 People people1 = (People) deepCopy(people); System.out.println("people :" + people); System.out.println("people1:" + people1); people1.setName("zzz"); people1.setAge(19); people1.getPet().setPName("饅頭"); people1.getPet().setPAge(3); System.out.println("after change people1"); System.out.println("people :" + people); System.out.println("people1:" + people1); } public static Object deepCopy(Object object) throws Exception { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(byteArrayOutputStream); oos.writeObject(object); ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray())); return ois.readObject(); } } @Data @Builder @NoArgsConstructor @AllArgsConstructor class People implements Cloneable, Serializable { private int age; private String name; private Pet pet; @Override public People clone() throws CloneNotSupportedException{ People people = (People) super.clone(); people.setPet(people.getPet().clone()); return people; } } @Data @Builder @NoArgsConstructor @AllArgsConstructor class Pet implements Cloneable, Serializable{ private String pName; private int pAge; @Override public Pet clone() throws CloneNotSupportedException{ return (Pet)super.clone(); } }