• 深拷贝浅拷贝区别


    区别:复制一个对象时,有两种情况:1.浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。 简而言之,需要复用现有对象的基本类型的成员变量数据时,浅拷贝即可

    2.复制整个对象(复制前后两个对象完全一样)。 深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。深拷贝相比于浅拷贝速度较慢并且花销较大。

     实体类

    import java.io.*;
    
     
    public class Student3 implements Serializable,Cloneable{
        private static final long serialVersionUID = 3462139480068147262L;
        private Integer age;
        private String name;
    
        public Student3(Integer age, String name) {
            this.age = age;
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
     
    

      测试类:举例java两种情况下拷贝具体例子(1.java clone方法及java序列化对象)

    java里面还有一种实现深拷贝的方法,就是运用对象的序列化机制。
    序列化机制有一种用法:提供了一种克隆对象的简便途径,只要对应的类是可序列化的就可以,做法是:直接将对象序列化到输出流中,然后将其读回,这样产生的新的对象是对现有对象的一个深拷贝。在此过程中,我们不必将对象写到文件中,因为可以用ByteArrayOutputStream将数据保存到字节数组中。

    public static void main(String[] args) throws CloneNotSupportedException {
            File file = new File("D:/test.txt");
            Student3 stu = new Student3(18, "xiaoxian");
    
            System.out.println("clone方法是浅拷贝");
            Student3 clone = (Student3)stu.clone();
            System.out.println("clone == stu的结果:"+ (clone==stu));
            System.out.println("clone.name == stu.name的结果:"+ (clone.name==stu.name));
    
            System.out.println("将对象序列化是深拷贝");
            //将对象序列化到IO流中
            try {
                ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
                objectOutputStream.writeObject(stu);
                objectOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            //将对象从IO流中反序列化出来
            try {
                ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));
                Student3 student3 = (Student3) objectInputStream.readObject();
                System.out.println("student3 == stu的结果:"+(stu == student3));
                System.out.println("student3.name == stu.name的结果:"+(stu.name == student3.name));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    } 
    

     

     

    上面我们仅考虑属性是常变量,如果属性也是一个对象的话,浅拷贝仅复制一个对象,属性成员对象被该对象和复制对象共享。深拷贝会再多复制一个属性成员的对象。

    实体

    class Student implements Cloneable {
        private String name;
        private int age;
        private Teacher teacher;  //一个属性对象,可观察一下深浅拷贝后这个对象是一个还是多了一个
    
        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 Teacher getTeacher() {
            return teacher;
        }
    
        public void setTeacher(Teacher teacher) {
            this.teacher = teacher;
        }
    
        public Object clone() throws CloneNotSupportedException {
            Object object = super.clone();
            return object;
        }
    }
    

      

  • 相关阅读:
    跨控制器跳转view——RedirectToRoute和RedirectToAction
    Web GIS离线解决方案
    逆变与协变详解
    C#操作符??和?:
    DBNull与Null的区别
    C#用DataTable实现Group by数据统计
    LINQ系列:LINQ to DataSet的DataTable操作
    Repeater数据控件的两个重要事件ItemDataBound 和 ItemCommand
    Visual Studio提示“无法启动IIS Express Web服务器”的解决方法
    ADO.NET 数据库备份等操作
  • 原文地址:https://www.cnblogs.com/yizhizhangBlog/p/16363000.html
Copyright © 2020-2023  润新知