首页 > 编程语言 >java深拷贝和浅拷贝介绍

java深拷贝和浅拷贝介绍

时间:2023-02-14 16:05:04浏览次数:35  
标签:java String clone private 介绍 拷贝 DeepPrptoType out


浅拷贝概念

java深拷贝和浅拷贝介绍_html

java深拷贝和浅拷贝介绍_html_02

 

java深拷贝和浅拷贝介绍_java_03

 

深拷贝概念

java深拷贝和浅拷贝介绍_html_04

java深拷贝和浅拷贝介绍_System_05

@Data
@Slf4j
public class Sheep implements Cloneable {
private String name;
private int age;
private String color;
private Sheep friend;

public Sheep(String name, int age, String color) {
this.name = name;
this.age = age;
this.color = color;
}

@Override
protected Object clone(){
Sheep sheep = null;
try {
sheep = (Sheep) super.clone();
} catch (Exception e) {
log.info("" + e);
}
return sheep;
}
}

java深拷贝和浅拷贝介绍_html5_06

@Data
public class DeepPrptoType implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
private String name;
private DeepCloneableTarget deepCloneableTarget;

public DeepPrptoType() {
}

//深拷贝方式1 使用clone方法
@Override
protected Object clone() throws CloneNotSupportedException {
Object deep = null;
//这里对基本数据类型和String对克隆
deep = super.clone();
DeepPrptoType deepPrptoType = (DeepPrptoType) deep;
deepPrptoType.deepCloneableTarget = (DeepCloneableTarget) deepCloneableTarget.clone();
return deepPrptoType;
}

//深拷贝,方式2 通过对象的序列化实现(推荐使用)
public static <T extends Serializable> T deepClone(T obj) {
T cloneObj = null;
try {
//写入字节流
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream obs = new ObjectOutputStream(out);
obs.writeObject(obj);
obs.close();

//分配内存,写入原始对象,生成新对象
ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray());
ObjectInputStream ois = new ObjectInputStream(ios);
//返回生成的新对象
cloneObj = (T) ois.readObject();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
return cloneObj;
}
}

java深拷贝和浅拷贝介绍_System_07

public class Client2 {
public static void main(String[] args) throws CloneNotSupportedException {
DeepPrptoType p = new DeepPrptoType();
p.setName("深拷贝");
p.setDeepCloneableTarget(new DeepCloneableTarget("大牛", "哈哈"));

//方式一:深拷贝
DeepPrptoType p2 = (DeepPrptoType) p.clone();
System.out.println(p.getName() + p.getDeepCloneableTarget().hashCode());
System.out.println(p2.getName() + p2.getDeepCloneableTarget().hashCode());

//通过序列化和反序列化实现深拷贝,说明引用类型所指向的对象也被clone了
DeepPrptoType p3 = DeepPrptoType.deepClone(p);
System.out.println(p3.getName() + p3.getDeepCloneableTarget().hashCode());
}
}

标签:java,String,clone,private,介绍,拷贝,DeepPrptoType,out
From: https://blog.51cto.com/u_15258465/6056062

相关文章

  • jvm优化base java GC垃圾回收
    OutOfMemoryError错误Java堆内存的OutOfMemoryError异常是实际应用中常见的内存溢出异常情况。当出现Java堆内存溢出时,异常堆栈信息“java.lang.OutOfMemoryError”会跟着......
  • Java 之 invokedynamic
    简述Addanewbytecode,invokedynamic,thatsupportsefficientandflexibleexecutionofmethodinvocationsintheabsenceofstatictypeinformation.--JSR......
  • JAVA和Spring的SPI机制讲解
    目录1SPI机制讲解1.1引言1.2JavaSPI实现1.2.1示例说明1.2.2相关测试1.2.3源码分析1.3SpringSPI1.3.1Spring示例1.3.2相关测试类1.3.3源码分析1SPI机制讲解......
  • JavaScript对象属性的特性高级功能
    “usestrict”/创建一个对象最简单的方式:创建一个Object的实例,然后再为它添加属性和方法/varperson=newObject();person.name=“Hongbin”;person.age=21;per......
  • java连接数据库实现增删改查功能
    packagecom.atguigu.api.preparedstatement;importorg.junit.Test;importjava.sql.*;importjava.util.Scanner;publicclassPreparedStatement_CRUD_Test{//TODO......
  • 编程基础与python介绍
    1、计算机内部存储数据的原理2、编程语言的发展史3、python解释器版本4、多版本的共存(重要)5、python的运行方式6、python的下载与安装7、路径8.环境变量 ......
  • 1 drf回顾 、2 前端发展历史、 3 vue介绍
    目录1drf回顾2前端发展历史3vue介绍1drf回顾#1drf入门规范 -前后端分离模式-前后端混合-postman-restful规范-drf:django的app#2序列化类......
  • 学好Java开发的关键7步
    1、多动手学编程语言不仅仅是从理论上的学习,更重要的是要利用这门语言为你的思想服务。理解这门语言是首要的,但是要达到心领神会、融会贯通就必须勤动手,多去时间,多编一......
  • Java 数组中紧跟 key 之后出现最频繁的数字
    数组中紧跟key之后出现最频繁的数字说明给你一个下标从0开始的整数数组nums,同时给你一个整数key,它在nums出现过。​统计在nums数组中紧跟着key后面出现的......
  • 三十分钟入门基础Go(Java小子版)
    作者:京东科技韩国凯前言Go语言定义​​Go(又称Golang)是Google的RobertGriesemer,RobPike及KenThompson开发的一种静态、强类型、编译型语言。Go语言语法与C相近......