美文网首页java中的设计模式
java中的深克隆和浅克隆,手把手教你怎么实现深克隆?

java中的深克隆和浅克隆,手把手教你怎么实现深克隆?

作者: 爱吃苹果的西瓜 | 来源:发表于2019-08-11 11:32 被阅读0次
    名词 概念
    深克隆(深拷贝) 指的是在复制java对象的时候java对象中的值不共享
    浅克隆(浅拷贝) 指的是在复制java对象的时候java对象中的值共享

    也就是说,如果我们需要完全复制出一个新的对象,我们需要重写clone方法

    举个例子吧(没有什么比代码更好说话)
    结果在最后!!!


      浅拷贝的代码如下:

    package com.javabase.designpattern.creationalpattern.prototype;
    
    
    /**
     * @des 浅拷贝
     *
     * @author 719383495@qq.com | 719383495qq@gmail.com | 有问题可以邮箱或者github联系我
     * @date 2019/8/10 17:14
     */
    public class SingleClone implements Cloneable {
    
    
        private String name;
    
        private String alias;
    
    
        public SingleClone(String name, String alias) {
            this.name = name;
            this.alias = alias;
        }
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAlias() {
            return alias;
        }
    
        public void setAlias(String alias) {
            this.alias = alias;
        }
    }
    

      深拷贝的代码如下:

    package com.javabase.designpattern.creationalpattern.prototype;
    
    
    import java.io.*;
    
    /**
     * @des 深拷贝
     * 
     * @author 719383495@qq.com | 719383495qq@gmail.com | 有问题可以邮箱或者github联系我
     * @date 2019/8/11 11:28
     */
    public class DeepClone implements Cloneable, Serializable {
    
        private String name;
        private String alias;
    
    
        public DeepClone(String name, String alias) {
            this.name = name;
            this.alias = alias;
        }
    
        @Override
        protected Object clone() {
            return deepClone();
        }
    
        private Object deepClone() {
            try {
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(bos);
                oos.writeObject(this);
                ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
                ObjectInputStream ois = new ObjectInputStream(bis);
                DeepClone deepClone = (DeepClone) ois.readObject();
                deepClone.setName("newName");
                deepClone.setAlias("newAlias");
                return deepClone;
    
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAlias() {
            return alias;
        }
    
        public void setAlias(String alias) {
            this.alias = alias;
        }
    }
    
    

      --->>>分析一波结果

    package com.javabase.designpattern.creationalpattern.prototype;
    
    
    /**
     * 深克隆和浅克隆的区别在于
     * 浅克隆克隆出来的对象地址不一样,但是其属性是公用的,这样的话会导致更改克隆的值会影响原来的值
     * 深克隆指的是不管是对象还是他的属性都重新复制一遍,对属性的操作不影响原来的值
     *
     * @author 719383495qq@gmail.com
     */
    public class ProtoTypeMain{
    
        public static void main(String[] args) {
            SingleClone test = new SingleClone("myName", "aliasName");
            System.out.println(test);
            try {
                SingleClone clone =(SingleClone) test.clone();
                System.out.println(clone);
                System.out.println(clone == test);
                System.out.println(test.getName() == clone.getName());
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
    
            DeepClone deep = new DeepClone("myName", "aliasName");
            System.out.println(deep);
            DeepClone deepClone = (DeepClone) deep.clone();
            System.out.println(deep == deepClone);
            System.out.println(deep.getName() == deepClone.getName());
            System.out.println(deepClone);
        }
    }
    
    

     我调用对象的clone方法,生成不一样的对象,但是对象的属性的值是相同的,我用==来进行判断,显示为ture。但是用自己写的深拷贝呢,对象和对象的属性都为false。


    结果图示

    相关文章

      网友评论

        本文标题:java中的深克隆和浅克隆,手把手教你怎么实现深克隆?

        本文链接:https://www.haomeiwen.com/subject/ljsfjctx.html