Chao's Blog Chao's Blog
首页
  • vue

    • vue路由
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • java
  • spring
  • springboot
  • springcloud
  • git
  • maven
  • nginx
  • tomcat
  • springmvc
  • jvm
  • 图数据库
  • mysql数据库
  • redis数据库
  • windows下docker安装nginx并挂载目录
  • linux命令
  • linux安装软件
  • linux脚本
  • idea
  • vscode
  • 归档
  • 综合项目

    • 若依项目
    • mall项目
  • java
  • mybatis
  • xxl-job
  • mybatis
GitHub (opens new window)

~chao

永远菜鸟,不断努力~
首页
  • vue

    • vue路由
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • java
  • spring
  • springboot
  • springcloud
  • git
  • maven
  • nginx
  • tomcat
  • springmvc
  • jvm
  • 图数据库
  • mysql数据库
  • redis数据库
  • windows下docker安装nginx并挂载目录
  • linux命令
  • linux安装软件
  • linux脚本
  • idea
  • vscode
  • 归档
  • 综合项目

    • 若依项目
    • mall项目
  • java
  • mybatis
  • xxl-job
  • mybatis
GitHub (opens new window)
  • java

    • java深度克隆
      • restemplate

      • hashcode()和equals()的作用、区别、联系
      • java8新特性
      • 接口与抽象类
      • java深度克隆工具类支持对象和list克隆
      • 子线程执行10次后,主线程再运行5次,这样交替执行三遍
      • CountDownLatch的理解和使用
      • CAS详解
      • java中的各种锁详细介绍
      • java线程池
      • Java锁之偏向级锁、轻量级锁、重量级锁
      • Transactional注解与try{}catch(Exception e){}同时使用事务控制无效问题
      • JAVA8 optional用法
      • CyclicBarrier 使用详解
      • Semaphore 使用及原理
      • Java中七大垃圾回收器
    • spring

    • springboot

    • springcloud

    • git

    • maven

    • nginx

    • tomcat

    • springmvc

    • jvm

    • 正则表达式

    • 消息中间件

    • python

    • 后端
    • java
    ~chao
    2022-11-14
    目录

    java深度克隆

    # java深度克隆

    版权声明:本文为CSDN博主「爪 哇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_40794973/article/details/106208799 (opens new window)

    浅克隆:复制对象时仅仅复制对象本身,包括基本属性,但该对象的属性引用其他对象时,该引用对象不会被复制,即拷贝出来的对象与被拷贝出来的对象中的属性引用的对象是同一个。

    深克隆:复制对象本身的同时,也复制对象包含的引用指向的对象,即修改被克隆对象的任何属性都不会影响到克隆出来的对象。

    值得一提的是,上文所说的浅拷贝只会克隆基本数据属性,而不会克隆引用其他对象的属性,但String对象又不属于基本属性,这又是为什么呢?

    这是因为String对象是不可修改的对象,每次修改其实都是新建一个新的对象,而不是在原有的对象上修改,所以当修改String属性时其实是新开辟一个空间存储String对象,并把引用指向该内存,而克隆出来的对象的String属性还是指向原有的内存地址,所以String对象在浅克隆中也表现得与基本属性一样。

    
    @Data
    public class Pig implements Cloneable, Serializable {
        private static final long serialVersionUID = 779970270042384579L;
        private String name;
        private Date birthday;
        public Pig(String name, Date birthday) {this.name = name;this.birthday = birthday;}
        // 方法1、深拷贝——使用clone方法
        //Remove this "clone" implementation; use a copy constructor or copy factory instead.
        @Override
        protected Pig clone() throws CloneNotSupportedException {
            Pig pig = (Pig) super.clone();
            //实现深度克隆要对引用类型重新克隆,如果对象中引用类型过多的话,写的代码会变多,也有可能会有遗漏
            pig.birthday = (Date) pig.birthday.clone();
            return pig;
        }
        // 2、深拷贝——通过对象的序列化实现 (推荐)
        public Pig deepClone() {
            //创建流对象
            ByteArrayOutputStream bos = null;
            ObjectOutputStream oos = null;
            ByteArrayInputStream bis = null;
            ObjectInputStream ois = null;
            try {
                //序列化
                bos = new ByteArrayOutputStream();
                oos = new ObjectOutputStream(bos);
                oos.writeObject(this); //当前这个对象以对象流的方式输出
                //反序列化
                bis = new ByteArrayInputStream(bos.toByteArray());
                ois = new ObjectInputStream(bis);
                return (Pig) ois.readObject();
            } catch (Exception e) {
                throw new RuntimeException(e.getMessage());
            } finally {
                //关闭流
                try {
                    bos.close();
                    oos.close();
                    bis.close();
                    ois.close();
                } catch (Exception e) {}
            }
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    编辑 (opens new window)
    上次更新: 2024/01/26, 05:03:22
    resttemplate 设置请求头和请求体

    resttemplate 设置请求头和请求体→

    最近更新
    01
    python使用生成器读取大文件-500g
    09-24
    02
    Windows环境下 Docker Desktop 安装 Nginx
    04-10
    03
    使用nginx部署多个前端项目(三种方式)
    04-10
    更多文章>
    Theme by Vdoing | Copyright © 2022-2024 chaos | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式