java中的淺拷貝與深拷貝

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();
    }
}
相關文章
相關標籤/搜索