java *shallow copy* *deep copy*

5598 ワード

引用する
オブジェクトコピー(Object Copy)とは、あるオブジェクトの属性を同じクラスのオブジェクトにコピーすることです.プログラム内でオブジェクトをコピーするのは一般的で、主に新しいコンテキスト環境でオブジェクトの一部またはすべてのデータを多重化するためです.Javaには、浅いコピー(Shallow Copy)、深いコピー(Deep Copy)、遅延コピー(Lazy Copy)の3種類のオブジェクトコピーがあります.
浅いコピーとは
浅いコピーは、元のオブジェクトのプロパティ値の正確なコピーを持つ新しいオブジェクトを作成します.属性が基本タイプである場合、コピーされるのは基本タイプの値です.プロパティがメモリアドレス(リファレンスタイプ)の場合、コピーはメモリアドレスです.そのため、オブジェクトの1つがこのアドレスを変更すると、別のオブジェクトに影響します.

// ,
public static class SchoolClass implements Cloneable {

    /**
     *     
     */
    public String mClassName;

    /**
     *    ,
     */
    public Teacher mTeacher;

    public SchoolClass(String className, Teacher teacher) {
        mClassName = className;
        mTeacher = teacher;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "SchoolClass{" +
                "mClassName='" + mClassName + '\'' +
                ", mTeacher=" + mTeacher.toString() +
                '}';
    }
}

public static class Teacher implements Cloneable {
    public String name;
    public String age;

    public Teacher(String name, String age) {
        this.name = name;
        this.age = age;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}

public static void main(String[] args) throws CloneNotSupportedException {
    SchoolClass sc1 = new SchoolClass("3.7", new Teacher("li", "30"));
    LogUtil.sysopl("sc1= " + sc1.toString());

    SchoolClass sc2 = (SchoolClass) sc1.clone();
    sc2.mClassName = "2.8";
    sc2.mTeacher.name = "liu";
    sc2.mTeacher.age = "25";

    LogUtil.sysopl("sc1= " + sc1.toString());
    LogUtil.sysopl("sc2= " + sc2.toString());
}

印刷結果
sc1= SchoolClass{mClassName='3.7', mTeacher=Teacher{name='li', age='30'}}
sc1= SchoolClass{mClassName='3.7', mTeacher=Teacher{name='liu', age='25'}}
sc2= SchoolClass{mClassName='2.8', mTeacher=Teacher{name='liu', age='25'}}

深いコピーとは
深いコピーは、すべてのプロパティをコピーし、プロパティが指す動的に割り当てられたメモリをコピーします.オブジェクトが参照されているオブジェクトと一緒にコピーされると、深いコピーが発生します.深いコピーは、浅いコピーに比べて速度が遅く、コストがかかります.
public static class SchoolClass implements Cloneable {

    /**
     *     
     */
    public String mClassName;

    /**
     *    ,
     */
    public Teacher mTeacher;

    public SchoolClass(String className, Teacher teacher) {
        mClassName = className;
        mTeacher = teacher;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        SchoolClass schoolClass = (SchoolClass) super.clone();
        schoolClass.mTeacher = (Teacher) schoolClass.mTeacher.clone();
        return schoolClass;
    }

    @Override
    public String toString() {
        return "SchoolClass{" +
                "mClassName='" + mClassName + '\'' +
                ", mTeacher=" + mTeacher +
                '}';
    }
}

public static class Teacher implements Cloneable {
    public String name;
    public String age;

    public Teacher(String name, String age) {
        this.name = name;
        this.age = age;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}

public static void main(String[] args) throws CloneNotSupportedException {
    SchoolClass sc1 = new SchoolClass("3.7", new Teacher("li", "30"));
    LogUtil.sysopl("sc1= " + sc1.toString());

    SchoolClass sc2 = (SchoolClass) sc1.clone();
    sc2.mClassName = "2.8";
    sc2.mTeacher.name = "liu";
    sc2.mTeacher.age = "25";

    LogUtil.sysopl("sc1= " + sc1.toString());
    LogUtil.sysopl("sc2= " + sc2.toString());
}

sc1= SchoolClass{mClassName='3.7', mTeacher=Teacher{name='li', age='30'}}
sc1= SchoolClass{mClassName='3.7', mTeacher=Teacher{name='li', age='30'}}
sc2= SchoolClass{mClassName='2.8', mTeacher=Teacher{name='liu', age='25'}}

。 ? , 。 。 , , 。

, 。 , , 。 , ( ) 。

https://blog.csdn.net/wangnanwlw/article/details/52300117
https://www.cnblogs.com/acode/p/6306887.html