Java深拷贝与浅拷贝的概念

浅拷贝(Shallow Copy)只复制对象的引用,而不复制对象本身。拷贝后的对象和原对象共享同一块内存地址中的子对象。修改其中一个对象的非基本类型属性时,另一个对象的对应属性也会被修改。

深拷贝(Deep Copy)会复制对象及其所有子对象,生成一个完全独立的新对象。拷贝后的对象和原对象完全分离,修改其中一个对象的属性不会影响另一个对象。

内存分析示例

假设有一个Person类,包含nameString)和addressAddress类)属性:

class Address {String city;// 构造方法、getter/setter省略
}class Person implements Cloneable {String name;Address address;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone(); // 默认浅拷贝}
}

浅拷贝实现与内存表现

Person p1 = new Person();
p1.name = "Alice";
p1.address = new Address("Beijing");Person p2 = (Person)p1.clone();

内存表现:

  • p1p2是两个独立对象,但它们的address属性指向同一个Address对象
  • 修改p2.address.city会影响p1.address.city

深拷贝实现方式

方法1:重写clone()
@Override
protected Object clone() throws CloneNotSupportedException {Person cloned = (Person)super.clone();cloned.address = (Address)this.address.clone(); // 递归克隆引用对象return cloned;
}

方法2:序列化实现
public Person deepCopy() throws IOException, ClassNotFoundException {ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(this);ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis);return (Person)ois.readObject();
}

内存表现:

  • p1p2完全独立,包括所有引用类型属性
  • 修改p2.address.city不会影响p1.address.city

性能与适用场景

浅拷贝:

  • 性能更好,仅复制引用
  • 适合引用对象不可变或不需要独立修改的场景

深拷贝:

  • 性能开销较大,需要递归复制所有对象
  • 适合需要完全独立对象的场景,如多线程环境

注意事项

  1. String等不可变对象在浅拷贝中是安全的
  2. 数组的clone()方法是浅拷贝
  3. 深拷贝可能导致循环引用问题
  4. 使用第三方库(如Apache Commons Lang的SerializationUtils)可以简化深拷贝实现

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DBeaver 的 PostgreSQL 驱动包默认存储位置

在 Windows 系统中,DBeaver 的 PostgreSQL 驱动包(JDBC 驱动 JAR 文件)默认存储位置如下: ###🔍 默认驱动安装路径 C:\Users\你的用户名\AppData\Roaming\DBeaverData\drivers说明:你的用户名:…

大数据毕业设计选题推荐:基于北京市医保药品数据分析系统,Hadoop+Spark技术详解

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

Package.xml的字段说明

package.xml 的版本说明 <package format"2"></package>每一个 package.xml 都以作为 root 标签&#xff0c;其中 format 代表版本,现在主要是版本 2 为主,与版本 1 之间的差别主要是一些子标签, package.xml 的必备标签 name:功能包名 version:版本号。…

JAVA【抽象类】和【接口】

在面向对象编程中&#xff0c;接口&#xff08;Interface&#xff09;和抽象类&#xff08;Abstract Class&#xff09;都是用于实现抽象化的机制&#xff0c;但它们在设计目的、语法规则和使用场景上有显著区别。以下是它们的核心区别&#xff1a; 1. 定义与关键字接口&#x…

Mysql系列--11、使用c/c++访问mysql服务

目录 一、准备 测试 二、创建对象 三、连接Mysql服务 四、下达指令 3.1增删改 增加 编码格式 删除 修改 3.2查询结果 结构体理解 打印属性 打印数据 前面我们已经学习并练习了本地命令行形式的sql语句的使用&#xff0c;可在以后开发中我们一般 不会直接命令行操作数据库&…

CS144 lab3 tcp_sender

0. 前言 这个实验做了挺久的&#xff0c;刚开始做的时候官方的代码库还是开着的。 调着调着代码官方把仓库给删掉了&#xff0c;又去找别人的代码仓库调发现不 对都打算放弃了&#xff0c;过了几天发现了一个start-code的库 再合进去简直完美。这个实验花的时间应该是前四个里面…

华为HCIP数通学习与认证解析!

大家好&#xff0c;这里是G-LAB IT实验室。在信息技术飞速发展的今天&#xff0c;随着华为产品和服务的广泛应用&#xff0c;成为一名华为数通工程师无疑是许多年轻从业者的目标。然而&#xff0c;对于许多人来说&#xff0c;面对令人眼花缭乱的华为认证体系&#xff0c;不禁要…

深度学习入门Day10:深度强化学习原理与实战全解析

一、开篇&#xff1a;智能决策的科学与艺术在前九天的学习中&#xff0c;我们掌握了处理各种数据类型的深度学习方法&#xff0c;但这些都属于"被动学习"——模型从静态数据中学习模式。今天&#xff0c;我们将进入一个全新的领域&#xff1a;强化学习&#xff08;Re…

Jenkins Pipeline(二)-设置Docker Agent

设计流水线的目的是更方便地使用 Docker镜像作为单个 Stage或整个流水线的执行环境。 1.安装必要插件 在Jenkins服务器上已经安装了插件。 Docker PipelinePipeline Maven IntegrationPipeline Maven Plugin API 如果插件缺少什么&#xff0c;再次检查并安装即可。 2. 配…

神经网络|(十六)概率论基础知识-伽马函数·中

【1】引言 前序学习进程中&#xff0c;已经初步了解了伽马函数&#xff0c;认识到nnn的阶乘计算可以转化为&#xff1a; n!n!⋅limk→∞kn⋅k!(nk)!limk→∞kn⋅k!⋅n!(nk)!limk→∞kn⋅k!(n1)(n2)...(nk)n!n! \cdot lim_{k\rightarrow\infty}\frac{k^n\cdot k!}{(nk)!}\\lim_…

设计模式Books Reading

文章目录 设计模式 创建型设计模式 工厂方法 示例说明 工厂方法模式结构 案例伪代码 工厂方法模式适合应用 实现方式 工厂方法模式优缺点 与其他模式的关系 概念示例 抽象工厂 抽象工厂模式结构 抽象工厂模式适合应用场景 实现方式 抽象工厂模式优缺点 与其他模式的关系 代码示…

接吻数问题:从球体堆叠到高维空间的数学奥秘

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 1 接吻数问题概述 接吻数问题&#xff08;Kissing Number Problem&am…

深度学习③【卷积神经网络(CNN)详解:从卷积核到特征提取的视觉革命(概念篇)】

文章目录先言1. 卷积核&#xff1a;特征检测的魔法窗口1.1什么是卷积核&#xff1a;可学习的特征检测器1.2可视化理解&#xff1a;边缘检测、纹理提取、特征发现1.3代码实现&#xff1a;使用PyTorch定义和初始化卷积层2. 卷积运算的数学原理2.1.离散卷积计算&#xff1a;滑动窗…

当不想安装telnet或nc时,可使用 Linux 系统默认自带的bash原生网络功能或ping(辅助判断)测试连通性

1. 用bash原生/dev/tcp测试端口&#xff08;无需任何工具&#xff09;bashshell 内置了/dev/tcp虚拟设备&#xff0c;可直接通过脚本测试端口是否能连接&#xff0c;执行以下命令&#xff08;替换数据库 IP 和端口&#xff09;&#xff1a;# 格式&#xff1a;echo > /dev/tc…

【STM32外设】ADC

声明&#xff1a;上图是STM32产品型号各字段含义&#xff0c;本文基于STM32F103 1、ADC的一些概念 常规通道(常规组)和注入通道(注入组)&#xff08;regular channels and injected channels&#xff09;ADC支持的外部通道总共16个&#xff08;且被3个ADC共享&#xff0c;ADC12…

Aha Moment——啊哈时刻!

1. 理解面试官的意图面试官问你“Aha moment”&#xff0c;其实是想知道&#xff1a;你是否真正理解这个概念&#xff1a;不只是背定义&#xff0c;而是理解其为什么重要。你如何发现它&#xff1a;考察你的数据分析方法论和技术能力&#xff08;用了哪些数据、指标、模型&…

RAG教程5:多表示索引和ColBERT

文章目录 导入依赖包 多表示索引 ColBERT 导入依赖包 %pip install youtube-transcript-api pytube多表示索引 from langchain_community.document_loaders import WebBaseLoader from langchain_text_splitters import RecursiveCharacterTextSplitterloader = WebBaseL

来自火山引擎的 MCP 安全授权新范式

资料来源&#xff1a;火山引擎-开发者社区 本文旨在深入剖析火山引擎 Model Context Protocol (MCP) 开放生态下的 OAuth 授权安全挑战&#xff0c;并系统阐述火山引擎为此构建的多层次、纵深防御安全方案。面对由 OAuth 2.0 动态客户端注册带来的灵活性与潜在风险&#xff0c;…

瑞芯微RK3506开发板PWM输入捕获驱动调试记录

本文演示PWM输入信号采集&#xff0c;基于触觉智能RK3506开发板。配置为&#xff1a; 3核Cortex-A7Cortex-M0多核异构处理器 主要接口&#xff1a;2路CAN FD&#xff0c;5路串口&#xff0c;RGB、MIPI、音频、USB2.0 OTG等、板载双百兆网口4G星闪SLEWiFi6BLE5.2。 PWM信号简…

PHP的header()函数分析

PHP的header()函数是HTTP协议交互的核心工具&#xff0c;它通过直接操纵响应头实现服务器与客户端之间的元数据通信。作为PHP原生函数&#xff0c;其设计初衷是处理HTTP协议层的关键操作&#xff0c;包括状态码设置、内容类型声明和缓存控制等基础功能。在Web开发中&#xff0c…