• 技术文章 >Java >Java基础

    Java中的“浅复制”与“深复制”的区别与实现(附代码)

    angryTomangryTom2019-11-26 15:53:10转载730

    将一个对象的引用复制给另一个对象,一共有三种方式。第一种方式是直接赋值,第二种方式是浅复制,第三种方式是深复制。

    1.直接赋值

    在Java中,A a1 = a2,这实际上复制的是引用,也就是说 a1 和 a2指向的是同一个对象。因此,当a1变化时,a2里面的成员变量也会跟着变化。

    2.浅复制(复制引用但不复制引用的对象)

    浅复制,又称为浅拷贝。创建一个新对象,然后将当前对象非静态字段复制到该新对象,如果字段是值类型的,那么对该字段执行复制;如果该字段时引用类型的话,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一个对象。

    (推荐视频:java视频教程

    class Resume implements Cloneable{ 
         public Object clone() { 
             try { 
                 return (Resume)super.clone(); 
             } catch (Exception e) { 
                 e.printStackTrace(); 
             return null; 
             } 
         } 
    }

    3.深复制(复制对象和其引用对象)

    又称深拷贝,不仅复制对象本身,而且复制对象包含的引用指向的所有对象。

    class Student implements Cloneable {
             String name;
             int age;
             Professor p;
         Student(String name, int age, Professor p) {
             this.name = name;
             this.age = age;
             this.p = p;
         }
         public Object clone() {
             Student o = null;
             try {
                 o = (Student) super.clone();
             } catch (CloneNotSupportedException e) {
                 System.out.println(e.toString());
             }
         o.p = (Professor) p.clone();
         return o;
         }
    }

    使用clone()方法克隆一个对象的步骤:

    1)被克隆的类要实现Cloneable接口。

    2)被克隆的类要重写clone()方法。

    那么在编程时,如何选择使用哪种复制方式呢?首先,检查类有无非基本类型(即对象)的数据成员。若没有,则返回super.clone()即可。若有,确保类中包含的所有非基本类型的成员变量都实现了深复制。

    引申:浅复制与深复制的区别?

    浅复制(Shallow Clone):被复制的对象的所有变量都含有与原来对象相同的值,而所有其他对象的引用仍然指向原来的对象。换而言之,浅复制仅仅复制所考虑的对象,而不复制它引用的对象。

    深复制(Deep Clone):被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制的新对象,而不是原有的那些被引用的对象。换而言之,深复制把复制的对象所引用的对象都复制了一遍。

    扩展:

    原型模式主要用于对象的复制,实现了接口(实现Cloneable接口),重写一个方法(重写Object类中的clone()方法),即完成了原型模式。

    原型模式中的拷贝分为“浅拷贝”和“深拷贝”:

    浅拷贝:对值类型的成员变量进行值的复制,对引用类型得成员变量只复制引用,不复制引用的对象。

    拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制。

    (Object类的clone方法只会拷贝对象中的基本数据类型的值,对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。)

    原型模式的优点:

    1.如果创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程。

    2.是永远是模式创建对象比直接new一个对象在性能上要好得多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。

    原型模式的使用场景:

    因为以上优点,所以在需要重复地创建相似对象时可以考虑使用原型模式。比如需要在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。

    本文来自php中文网,java教程栏目,欢迎学习!

    以上就是Java中的“浅复制”与“深复制”的区别与实现(附代码)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:博客园,如有侵犯,请联系admin@php.cn删除
    专题推荐:java 深复制 浅复制
    上一篇:Java操作数据库——使用连接池连接数据库 下一篇:如何避免java程序中出现乱码
    大前端线上培训班

    相关文章推荐

    • Java中对象的深复制(深克隆)和浅复制(浅克隆)之序列化• JAVA中浅复制与深复制• php中关于浅复制和深复制的详解• js实现深复制代码分享

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网