浅克隆:

实现Cloneable接口即可实现,浅克隆只对象内部的基础数据类型(包括包装类)被克隆,引用数据类型(负责对象)会被使用引用的方式传递。
简单来说,就是浅克隆属性如果是复杂对象,对象是不会被复制一份的。
示例如下:

package com.comleader.utils.test;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @Author: Daisen.Z* @Date: 2023/3/10 9:53* @Version: 1.0* @Description:*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Friend {private String name;private Integer age;private String home;
}

注意: 需要重新clone方法,将方法的protected改为public

package com.comleader.utils.test;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @Author: Daisen.Z* @Date: 2023/3/10 9:53* @Version: 1.0* @Description:*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person implements Cloneable {private String name;private Integer age;private String home;private Friend friend;@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}public static void main(String[] args) throws CloneNotSupportedException {Person person_old = new Person();person_old.setName("张三");person_old.setAge(18);person_old.setHome("chengdu");person_old.setFriend(new Friend("李四",19,"chongqin"));System.out.println("初始化下的person:" + person_old);Person person_clone = (Person) person_old.clone();person_clone.setName("张武");person_clone.setAge(19);person_clone.getFriend().setAge(20);System.out.println("克隆出来的person:" + person_clone);System.out.println("修改之后的person:" + person_clone);System.out.println("修改后的原person:" + person_old);}
}

运行Person中的main方法,

观察结果可以看出,修改Person的克隆对象的friend复杂属性时,原对象包括原对象的所有克隆对象friend属性都会被修改。
而修改String和Integer的则互不影响。

补充知识:

clonable接口的克隆方式,相比较于new对象的方式,不需要再计算内存分布,而是直接将内存区域分配给克隆对象,在大数据量的重复对象创建时可以使用clonable来优化性能。

深克隆:

深克隆的方式只能自己重新Cloneable方法或者序列化的方式实现。

重新克隆方法的方式:

1、 Friend实现Cloneable接口,并重写clone()方法。

@Data
@NoArgsConstructor
@AllArgsConstructor
class Friend implements Cloneable{private String name;private Integer age;private String home;@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}
}

2、 更改Person中的clone()方法

@Data
@NoArgsConstructor
@AllArgsConstructor
class Person implements Cloneable{private String name;private Integer age;private String home;private Friend friend;@Overridepublic Object clone() throws CloneNotSupportedException {Person person = (Person) super.clone();person.friend = (Friend) friend.clone();return person;}
}

这样克隆时,内部复杂对象也被克隆。

通过序列化对象的方式

如果当类中的属性存在数组(数组不能实现Cloneable接口)或者属性之间的关系比较复杂时,上面的方法都不能很好的实现深克隆了。

序列化的方式是让每个类都实现Serializable接口,然后通过序列化和反序列化操作达到深克隆的目的。

package test;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.*;@Data
@NoArgsConstructor
@AllArgsConstructor
class Person implements Serializable{private String name;private Integer age;private String home;private Friend friend;}@Data
@NoArgsConstructor
@AllArgsConstructor
class Friend implements Serializable {private String name;private Integer age;private String home;}public class CloneTest {public static void main(String[] args) throws CloneNotSupportedException, IOException, ClassNotFoundException {Person person_old = new Person();person_old.setName("张三");person_old.setAge(18);person_old.setHome("chengdu");person_old.setFriend(new Friend("李四",19,"chongqin"));System.out.println("初始化下的person:" + person_old);ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);objectOutputStream.writeObject(person_old);     //  序列化ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);Person person_clone = (Person) objectInputStream.readObject();  //反序列化person_clone.setName("张武");person_clone.setAge(19);person_clone.getFriend().setAge(20);System.out.println("克隆出来的person:" + person_clone);System.out.println("修改之后的person:" + person_clone);System.out.println("修改后的原person:" + person_old);}
}

总结:

1、 浅克隆性能相比较new会有一些提高(很小),但是编码省了很多。
2、深克隆第一种实现方式同1。
3、深克隆的第二种实现方式在数据量多的情况下性能较差,但是当类属性特别多、对象占用空间特别大时会有较好效果,另外通过序列化可以将对象当前的形态以文件、IO流的方式保存下来,在需要时再进行加载转换,

Java中的深克隆与浅克隆相关推荐

  1. 浅析Java中的深克隆和浅克隆

    说实话,目前为止还没在项目中遇到过关于Java深克隆和浅克隆的场景.今天手抖戳开了花呗账单,双十二败家的战绩真是惨不忍睹,若能在我的客户端"篡改"下账单金额,那该(简)有(止)多( ...

  2. Java中的深克隆和浅克隆的原理及三种方式实现深克隆

      本文详细介绍了Java中的浅克隆和深克隆的概念,及案例演示如何实现深克隆! 文章目录 1 克隆概述 2 深克隆实现 3 案例 3.1 测试普通clone方法--浅克隆 3.2 使用重写后的clon ...

  3. java中的深度克隆浅克隆_了解Java中的可克隆接口

    java中的深度克隆浅克隆 什么是对象克隆? 对象克隆是生成具有不同名称的对象的精确字段到字段副本的过程. 克隆的对象在内存中有自己的空间,可在其中复制原始对象的内容. 这就是为什么在克隆后更改原始对 ...

  4. Java中的浅克隆与深克隆

    Java中的浅克隆与深克隆 一:前言 二:浅克隆与深克隆的区别 一:前言 克隆,即复制一个对象,该对象的属性与被复制的对象一致,如果不使用Object类中的clone方法实现克隆,可以自己new出一个 ...

  5. java中浅克隆与深克隆解析

    文章目录 简介 浅克隆 深克隆 嵌套使用clone()方法 序列化方式 浅克隆和深克隆的比较 简介 所谓克隆,就是指依照已存在的数据,复制出一份一样的数据. java中的克隆有浅克隆和深克隆之分,造成 ...

  6. Java中对象的深克隆和浅克隆

    2019独角兽企业重金招聘Python工程师标准>>> 浅克隆和深克隆的概念 浅克隆:被克隆的对象里的所有变量值都与原来的对象相同,而所有对其他对象的引用仍然指向原来的对象.简而言之 ...

  7. Java中对象的深复制(深克隆)和浅复制(浅克隆)介绍

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...

  8. 详细分析Java中的浅克隆和深克隆

    本文对浅克隆和深克隆的两种方法(不引入别的开源工具)进行了简单的代码实现(没有内部类语法),对比了浅克隆和深克隆对引用类型的影响,暂不考虑不可变类,确保初学Java者能够看懂并学会,可直接复制源代码进 ...

  9. JAVA深复制(深克隆)与浅复制(浅克隆)

    引用自 http://blog.csdn.net/rj042/article/details/21418413 作者 rj042 1.浅复制与深复制概念 ⑴浅复制(浅克隆或者影子克隆) 被复制对象的所 ...

最新文章

  1. 检查数据库的CPU和PSU补丁信息
  2. mysql去除输入的字符串中的中文_Sql得到(去除)字符串中所有汉字,字母,数字的函数...
  3. html5 datalist属性,HTML5 元素 datalist 介绍
  4. Flink 架构:三层架构体系、运行时组件
  5. 一段能用来统计ip访问的代码(自用)包括所在地
  6. PHP PSR4自动加载代码赏析
  7. 密码必须至少为6个字符_1081 检查密码 (15分)
  8. [C++] vector 初始化
  9. moss 自定义文档库文档图标
  10. 【181012】VC++ 中国象棋人机对弈程序源代码
  11. Encrypt java_ESAPI对称加密使用JavaEncryptor
  12. awr报告分析 mysql_mysql-awr报告
  13. PHP集成环境Visual-AMP
  14. keepass和坚果云实现全平台密码管理
  15. wow 如何写dz 宏
  16. TensorFlow从1到2(十一)变分自动编码器和图片自动生成
  17. Waiting alone
  18. python如何用for循环写九九乘法表
  19. 编码过程中单词常用的缩写方式(转载)
  20. 信息时代的眼睛保护色

热门文章

  1. MapReduce数据分析(10)综合实战
  2. siege 安装及使用
  3. unity 场景切换fade的实现
  4. lammps教程:以计算Fe晶格常数为例介绍jump命令使用
  5. moco框架的简单搭建
  6. 寒假本科创新——机器学习(二)
  7. Tensorflow 口罩识别
  8. [深度学习]暴走的残差深度学习网络家族!加深了网络还是隐式多网络叠加?
  9. 网络空间安全有哪些定义?我国网络空间安全面临哪些机遇?我国网络空间安全面临哪些挑战?
  10. 高精度肺结节自动检测方案 | 算法解析