谈谈你对深拷贝和浅拷贝的理解-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());
        }

    }
}


 

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