Java 中的浅度克隆与深度克隆(测试用例)

来源:互联网 发布:悉尼周边游 知乎 编辑:程序博客网 时间:2024/05/27 06:55
// 这里借助了 Hutool 工具包,www.hutool.cnimport com.xiaoleilu.hutool.clone.CloneSupport;public class Student extends CloneSupport<Student> implements Serializable {    private String         name;    private int            age;    private List<Tortoise> tortoises;    public Student() {    }    public Student(String name, int age, List<Tortoise> tortoises) {        this.name = name;        this.age = age;        this.tortoises = tortoises;    }    @Override    public String toString() {        return "Student{" +                "name='" + name + '\'' +                ", age=" + age +                ", tortoises=" + tortoises +                '}';    }    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 List<Tortoise> getTortoises() {        return tortoises;    }    public void setTortoises(List<Tortoise> tortoises) {        this.tortoises = tortoises;    }}
public class Tortoise implements Serializable {    private String name;    private int    age;    public Tortoise() {    }    public Tortoise(String name, int age) {        this.name = name;        this.age = age;    }    @Override    public String toString() {        return "Tortoise{" +                "name='" + name + '\'' +                ", age=" + 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 class CloneTest {    private static List<Tortoise> oldTortoises = new ArrayList<Tortoise>();    private static List<Tortoise> newTortoises = new ArrayList<Tortoise>();    static {        oldTortoises.add(new Tortoise("old_巴西龟1", 3));        oldTortoises.add(new Tortoise("old_巴西龟2", 5));        newTortoises.add(new Tortoise("new_巴西龟1", 4));        newTortoises.add(new Tortoise("new_巴西龟2", 6));    }    /**     * 场景 1:对象引用     */    @Test    public void testRefer() {        Student student1 = new Student("wgj", 24, oldTortoises);        Student student2 = student1;        // 设置 tortoises,tortoises 指向同一地址        // student1.setTortoises(newTortoises);        // student2.setTortoises(newTortoises);        // 改变 tortoises,tortoises 内容一起改变        student1.getTortoises().add(new Tortoise("add_巴西龟3", 7));        compare(student1, student2);    }    /**     * 场景 2:浅度克隆     */    @Test    public void testClone() {        Student student1 = new Student("wgj", 24, oldTortoises);        Student student2 = student1.clone();        // 设置 tortoises,tortoises 指向不同地址        // student1.setTortoises(newTortoises);        // student2.setTortoises(newTortoises);        // 改变 tortoises,tortoises 内容一起改变        student1.getTortoises().add(new Tortoise("add_巴西龟3", 7));        compare(student1, student2);    }    /**     * 场景 3:深度克隆     */    @Test    public void testCloneByStream() {        Student student1 = new Student("wgj", 24, oldTortoises);        Student student2 = ObjectUtil.cloneByStream(student1);        // 设置 tortoises,tortoises 指向不同地址        // student1.setTortoises(newTortoises);        // student2.setTortoises(newTortoises);        // 改变 tortoises,tortoises 内容不会一起改变        student1.getTortoises().add(new Tortoise("add_巴西龟3", 7));        compare(student1, student2);    }    /**     * 比较     *     * @param o1     * @param o2     */    private void compare(Object o1, Object o2) {        System.out.println("==: " + (o1 == o2));        System.out.println("equals: " + (o1.equals(o2)));        System.out.println(o1.toString());        System.out.println(o2.toString());    }}
原创粉丝点击