談談你對深拷貝和淺拷貝的理解-Java

一、區別

  1. 深拷貝中既要拷貝基本數據類型也要拷貝引用類型的數據,也就是說拷貝一份完全一樣的對象。

  2. 淺拷貝中之拷貝基本數據類型,引用類型的數據只是拷貝了原來的引用,並沒有把引用的數據也拷貝。

 

二、方式

1. 深拷貝的一般需要序列化對象,然後根據流進行復制,這樣就保證了引用的數據也拷貝了進來。另外還有一種常見的就是將對象中的引用數據遞歸的淺拷貝,這樣得到的對象也是深拷貝,淺顯一點就是說:遞歸淺拷貝=深拷貝

2. 淺拷貝一般就是將原型對象實現cloneable接口,然後重寫clone方法,然後返回super.clone(); 這樣的到的對象就是淺拷貝。

三、應用

 

1. Arrays.copyOf()方法雖然返回的是一個新的數組,但是任然保留了原有的引用,所以再修改新的對象的引用數據的時候發現舊的也發生了改變,導致數據錯亂。

2. BeanUtils.copyProperties()方法也是,只是做了淺顯的拷貝,並沒有做真正的拷貝,需要深拷貝的就需要重寫該方法。另外對於日期的數據的支持也不是太好!!!😳

四、上代碼驗證

public class Teacher {
    private String name;
    private int Salary;
 
    public Teacher(String name,int salary){
        this.name = name;
        this.Salary = salary;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }

 
    public void setSalary(int salary) {
        Salary = salary;
    }
 
    public int getSalary() {
        return Salary;
    }

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

    public static void main(String[] args){
        List<Teacher> list = new ArrayList<>(3);
        Teacher asdfa = new Teacher("asdfa", 445);
        Teacher aasd = new Teacher("aasd", 55);
        Teacher adf = new Teacher("adf", 123);
        list.add(aasd);
        list.add(asdfa);
        list.add(adf);
        
        Teacher[] teachers = Arrays.copyOf(Teachers,Teachers.length);
        for(Teacher s : teachers){
            System.out.println(s.toString());
        }
        // 讀者注意這裏,對teacher做了改動
        teachers[1].setName("adfghjkl");
        for(Teacher s : teachers){
            System.out.println(s.toString());
        }
        for(Teacher s : teachers){
            System.out.println(s.toString());
        }

    }
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章