zoukankan      html  css  js  c++  java
  • 深拷贝与浅拷贝的区别

    深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。

    假设B复制了A,修改A的时候,看B是否发生变化:

    如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值)

    如果B没有改变,说明是深拷贝,自食其力!(修改堆内存中的不同的值)

    浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,

    深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,

    使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。

    浅复制:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。

    深复制:在计算机中开辟一块新的内存地址用于存放复制的对象。

    代码示例:

     /**
         * 深拷贝与浅拷贝的区别
         *
         * 1、浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址
         * 2、深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,
         *
         * 深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。
         * 假设B复制了A,修改A的时候,看B是否发生变化:
         *
         * 如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值)
         * 如果B没有改变,说明是深拷贝,自食其力!(修改堆内存中的不同的值)
         */
        @Test
        void testDeepCopy() {
            Cpu cpu = new Cpu();
            cpu.setName("酷睿i5");
            Computer computer = new Computer();
            computer.setPrice(5000.0);
            computer.setCpu(cpu);
            Computer computerCopy = new Computer();
            BeanUtils.copyProperties(computer, computerCopy);
            System.out.println(computerCopy);
            //debug模式运行 下面一行代码后查看 第一台电脑和第二台电脑是否共用一个cpu
            //浅拷贝
            computerCopy.getCpu().setName("i7");
    
            //debug模式运行 下面一行代码后查看 第三台电脑和第一台电脑是否共用一个cpu
            //使用流的方式实现深拷贝
            Computer computerRes = (Computer) cloneObjBySerialization(computer);
            computerRes.getCpu().setName("i3");
    
            //debug模式运行 下面一行代码后查看 第四台电脑和第一台电脑是否共用一个cpu
            //使用fastJson 实现深拷贝 底层任然是输入输出流
            String s = JSONObject.toJSONString(computer);
            Computer computerObj = JSONObject.parseObject(s, Computer.class);
            computerObj.getCpu().setName("麒麟990");
        }
    
    
        private static Object cloneObjBySerialization(Serializable src) {
            Object dest = null;
            try {
                ByteArrayOutputStream bos = null;
                ObjectOutputStream oos = null;
                try {
                    bos = new ByteArrayOutputStream();
                    oos = new ObjectOutputStream(bos);
                    oos.writeObject(src);
                    oos.flush();
                } finally {
                    oos.close();
                }
                byte[] bytes = bos.toByteArray();
                ObjectInputStream ois = null;
                try {
                    ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
                    dest = ois.readObject();
                } finally {
                    ois.close();
                }
            } catch (Exception e) {
                e.printStackTrace();//克隆失败
            }
            return dest;
        }
  • 相关阅读:
    VS中,如何将存在于解决方案里,但是没有显示出来的文件(或文件夹)显示到项目中。
    (转)分布式系统编程,你到哪一级了?
    领域驱动架构学习总结
    Java多线程总结
    MySQL更新优化
    MySQL查询优化
    MySQL索引
    MySQL优化
    MySQL联接操作
    MySQL架构
  • 原文地址:https://www.cnblogs.com/donleo123/p/14140684.html
Copyright © 2011-2022 走看看