Java 对象深拷贝

news2024/11/14 21:54:24

需求

写一个java对象深拷贝工具,用以对象深拷贝。

分析

在 Java 中,变量间值的传递分为两种。对于 int,char,string,等基本数据类型进行值传递时,使用值传递。即原变量 a 的值与新变量 b 的值相等,且 a 与 b 拥有不同的内存地址;对于非基本数据类型的变量进行传值时使用引用传值。即原变量 a 与新变量 b 的值相同(因为他们都指向相同的内存地址),且 a 与 b 拥有相同的内存地址。

基本数据类型传值示意

int a = 10;
int b = a;

如下图,当执行 int a = 10; 时,JVM 会先对变量 a 分配内存 0x0001 , 并在其中存储数据 10。当执行 int b = a; 时,JVM 也会为变量 b 分配一块内存 0x0011 ,并在其中存储 10。
在这里插入图片描述

引用数据类型传值示意

User a = new User();
User b = a;

// 或 方法传值

User a = new User();
addUser(a);
private void addUser(User b){
// …… 业务省略
}

如下图,当执行 User a = new User(); 时,JVM 会分配一块内存,其中存储着对象 User 的初始化信息,紧接着,JVM 将该内存的地址 0x0001 分配给变量 a;当程序执行到 User b = a;addUser(a); 时,
在这里插入图片描述

浅拷贝

对基本数据类型进行值传递,对引用数据类型进行引用传递的拷贝,为浅拷贝。

深拷贝

对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,为深拷贝。

综上,浅拷贝与深拷贝的差异在于对引用对象的拷贝,如果是的引用类型的数据拷贝与基本数据类型的拷贝达到相同的效果(除了值相同外,其他所有都不相同)则认为完成了数据深拷贝。

实现

  • 序列化拷贝

先将对象序列化,然后再反序列化为一个新的对象。最简单的序列化拷贝方法是结合JSON,先将对象转为JSON,再将JSON转为一个新的对象。

使用 googleGSON 序列化和反序列化代码如下:

// 对象 a
User a = new User();
// 创建 Gson 实例
Gson gson = new Gson();
// 序列化为 json 字符串
String jsonStr = gson.toJson(a);
// 反序列化 json 字符串为 对象 b 
User b = gson.fromJson(jsonStr,User.class);

另一种常用序列化拷贝是借助于 commons-lang 工具包下的 org.apache.commons.lang.SerializationUtils 类,代码如下

// User 必须实现 Serializable
User a = new User();
User b = (User)SerializationUtils.clone(a);

注: 采用 SerializationUtils 工具序列化拷贝的对象必须实现 Serializable 接口。

总结

以上介绍了浅拷贝和深拷贝的概念,并且介绍了两种常用的深拷贝方法。当然,也可以自己实现深拷贝,比如通过反射实现,或者通过重写 clone 方法实现等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/382553.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML认知

HTML认知 文章目录HTML认知语法规范注释标签组成和关系标签的关系标签学习排版系列标签**标题标签****段落标签**换行标签水平线标签文本格式化标签媒体标签图片标签src 目标图片的路径alt 替换文本title 图片的标题width 宽度 / height 高度路径绝对路径相对路径(常…

win10搭建android monkeyrunner自动化测试环境

本文记录一下monkeyrunner环境搭建遇到的各种坑,以免以后再次踩坑。首先要提一下巨坑,务必要安装java 8(本文记录于2023.3),安装其他版本java,运行monneyrunner会有很多问题,见第七节。 一、安…

Threejs 教程1

threejs核心概念场景、照相机、对象、光、渲染器等1.1.场景Scene 场景是所有物体的容器,对应着显示生活中的三维世界,所有的可视化对象级相关的动作均发生在场景中。1.2.照相机Camera照相机是三维世界中的观察者,类似与眼睛。为了观察这个世界…

5款软件压力测试工具分享

一、什么是软件压力测试? 软件压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分。软件压力测试的基本思路很简单:不是在常规条件下运行手动或自动测试,而是在计算机数量较少或系统资源匮乏的条件下运行测试。通常要进行…

达梦: DmAPService可以手动开启,但是不能开机自启

在部署生产环境安全版数据库发现,DmAPService服务不能开机自启,这样会导致服务器重启后,部署的定时备份任务不能够成功备份数据。 为了在服务器重启后,不影响定时任务自动备份数据库,现将解决这个问题的办法总结如下&a…

《MySql学习》 MySQL的 加锁规则

MySQL加锁原则 两个原则 原则 1:加锁的基本单位是 next-key lock。next-key lock 是前开后闭区间(区间锁和行锁)。原则 2:查找过程中访问到的对象(索引)才会加锁。 两个优化 1.优化 1:索引上…

美团2面:如何保障 MySQL 和 Redis 数据一致性?这样答,让面试官爱到 死去活来

美团2面:如何保障 MySQL 和 Redis 的数据一致性? 说在前面 在尼恩的(50)读者社群中,经常遇到一个 非常、非常高频的一个面试题,但是很不好回答,类似如下: 如何保障 MySQL 和 Redis…

JavaSE学习进阶 day1_02 继承(面向对象第二大特性)

第三章 继承 (面向对象的第二大特性) 3.1 概述 3.1.1 引入 假如我们要定义如下类: 学生类,老师类和工人类,分析如下。 学生类 属性:姓名,年龄 行为:吃饭,睡觉 老师类 属性:姓名,年龄,薪水 行为:吃饭,睡觉,教书 班…

C++ List链表使用

1. list的介绍及使用1.1 list的介绍1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个…

百度飞桨PaddleSpeech的简单使用

PaddleSpeech 是基于飞桨 PaddlePaddle 的语音方向的开源模型库,用于语音和音频中的各种关键任务的开发,包含大量基于深度学习前沿和有影响力的模型,一些典型的应用示例如下:语音识别、语音翻译 (英译中)、语音合成、标点恢复等。…

《商用密码应用与安全性评估》第一章密码基础知识1.2密码评估基本原理

商用密码应用安全性评估(简称“密评”)的定义:在采用商用密码技术、产品和服务集成建设的网络与信息系统中,对其密码应用的合规性、正确性、有效性等进行评估 信息安全管理过程 相关标准 国际:ISO/IEC TR 13335 中国:GB/T …

跨境电商独立站到底有什么优缺点?

无论你在哪个行业,都有优点和缺点,正如人们常说的,人无完人。那么我们就来谈谈最近比较多人关注的跨境电商独立网站的缺点:1. 这个过程很麻烦。跨境电商独立站的有效周期需要比较长,因为前期需要投入大量的精力,比如推…

【flink】 flink入门教程demo 初识flink

文章目录通俗解释什么是flink及其应用场景flink处理流程及核心APIflink代码快速入门flink重要概念什么是flink? 刚接触这个词的同学 可能会觉得比较难懂,网上搜教程 也是一套一套的官话, 如果大家熟悉stream流,那或许会比较好理解…

异步循环

业务 : 批量处理照片 , 批量拆建 , 裁剪一张照片需要异步执行等待 , 并且是批量 所以需要用到异步循环 裁剪图片异步代码 : 异步循环 循环可以是 普通 for 、 for of 、 for in 不能使用forEach ,这里推荐 for…

笔记-什么是神经网络机器学习深度学习

深度学习:一种实现机器学习的技术所谓深度学习,简单来说是机器学习的一个子集,用于建立、模拟人脑进行数据处理和分析学习的神经网络,因此也可以被称作是深度神经网络。其基本特点是模仿大脑的神经元之间传递和处理信息的模式。深…

如何使用固态继电器实现更高可靠性的隔离和更小的解决方案尺寸

自晶体管发明之前,继电器就已被用作开关。从低压信号安全控制高压系统的能力,如隔离电阻监控,对于许多汽车系统的开发是必要的。虽然机电继电器和接触器的技术多年来有所改进,但设计人员要实现其终身可靠性和快速开关速度以及低噪…

计算机图形学(1):VS配置openGL和画一个简单正方形

简单记录一下这门课的学习过程 1.下载并安装VS 直接看这片文章即可 http://t.csdn.cn/auPGf 2.下载OpenGL相关库 已经打包好了 需要的可以直接下载: 链接:https://pan.baidu.com/s/1Q7XTD4jkRhRBfTW9wYgzGg?pwd1111 提取码:1111 3.打开…

触摸屏与模拟量测试终端之间无线MODBUS通信

本方案是昆仑通态触摸屏与4台DTD433FC无线模拟量信号测试终端进行无线 MODBUS 通信的实现方法。本方案中昆仑通态触摸屏作为主站显示各从站的模拟量信号,传感器、DCS、PLC、智能仪表等4个设备作为Modbus从站输出模拟量信号。方案中采用无线模拟量信号测控终端DTD433…

UVM实战--带有寄存器的加法器

一.整体的设计结构图 这里将DUT换成加法器,可以理解为之前UVM加法器加上寄存器,这里总线的功能不做修改,目的看代码的移植那些部分需要修改。 二.各个组件代码详解 2.1 DUT module dut( input clk, input rst_n, input…

【深度学习】softmax和交叉熵的配合求导

在分类问题中,尤其是在神经网络中,交叉熵函数非常常见。因为经常涉及到分类问题,需要计算各类别的概率,所以交叉熵损失函数与sigmoid函数或者softmax函数成对出现。 1.softmax softmax用于多分类过程中&#xff0…