Java中的深拷贝与浅拷贝

深拷贝与浅拷贝

深拷贝和浅拷贝是编程中常用的两种对象复制方式,它们在复制对象时处理对象内部引用的方式上有所不同。

浅拷贝

浅拷贝(Shallow Copy)只复制对象的顶层结构,而不复制对象内部的引用对象。换句话说,浅拷贝只复制对象的值类型字段和引用类型字段的引用,而不复制引用对象本身。

  • 特点:如果原始对象中的字段是值类型,则复制其值;如果字段是引用类型,则复制引用地址而不是引用的对象本身。
  • 结果:浅拷贝后的新对象与原对象共享引用类型的成员。因此,修改其中一个对象的引用类型成员可能会影响另一个对象。

举例(伪代码):

original = { a: 1, b: { c: 2, d: 3 } }
shallowCopy = copy(original) // 浅拷贝
// shallowCopy = { a: 1, b: { c: 2, d: 3 } } 但 shallowCopy.b 和 original.b 指向同一个对象

深拷贝

深拷贝(Deep Copy)则是复制对象的所有层级结构。一个对象进行深拷贝后,不仅复制了对象的顶层结构,还复制了对象内部的所有引用对象。

  • 特点:无论是值类型还是引用类型,都会被完全复制到新对象中。
  • 结果:深拷贝后的对象与原对象不共享任何成员。修改一个对象的任何成员不会影响到另一个对象。

举例(伪代码):

original = { a: 1, b: { c: 2, d: 3 } }
deepCopy = deepcopy(original) // 深拷贝
// deepCopy = { a: 1, b: { c: 2, d: 3 } } 且 deepCopy.b 和 original.b 指向不同的对象

应用

浅拷贝通常用于复制不包含复杂对象或不需要独立操作引用对象的场景。而深拷贝则适用于需要完全独立的对象副本,或者当对象内部也包含引用对象时。

在不同的编程语言中,实现深拷贝和浅拷贝的方式可能不同。例如,在JavaScript中,可以使用Object.assign()或扩展运算符{...obj}实现浅拷贝,而深拷贝可能需要递归复制或使用如JSON.parse(JSON.stringify(obj))这样的技巧。在Python中,copy模块提供了copy()(浅拷贝)和deepcopy()(深拷贝)函数。

Java中的深拷贝与浅拷贝

在Java中,深拷贝和浅拷贝是处理对象复制时常见的两种方法,它们在处理对象内部引用时有本质的区别。

浅拷贝(Shallow Copy)

浅拷贝创建一个新的对象,然后将原始对象的非静态字段复制到新对象。如果字段是值类型(如基本数据类型),它将复制值;如果字段是引用类型,则复制引用但不复制引用的对象本身。

  • 实现方式:在Java中,浅拷贝通常可以通过使用Object.clone()方法来实现。为了使用clone()方法,类必须实现Cloneable接口并重写clone()方法。
  • 示例
    public class ShallowCopyExample implements Cloneable {private int[] data;public ShallowCopyExample() {data = new int[10];for (int i = 0; i < data.length; i++) {data[i] = i;}}public ShallowCopyExample clone() {try {return (ShallowCopyExample) super.clone();} catch (CloneNotSupportedException e) {return null;}}
    }
    

在这个例子中,clone()方法创建了ShallowCopyExample对象的浅拷贝。数组data的新引用被创建,但数组的内容并没有被复制。

深拷贝(Deep Copy)

深拷贝不仅复制对象及其字段,还递归复制它引用的所有对象。这意味着整个对象树都被复制了。

  • 实现方式:在Java中,实现深拷贝可以通过多种方式,例如递归复制所有对象、使用序列化/反序列化等。
  • 示例(使用序列化)
    import java.io.*;public class DeepCopyExample implements Serializable {private int[] data;public DeepCopyExample deepCopy() {try {ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream out = new ObjectOutputStream(bos);out.writeObject(this);ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream in = new ObjectInputStream(bis);return (DeepCopyExample) in.readObject();} catch (IOException | ClassNotFoundException e) {return null;}}
    }
    

在这个例子中,deepCopy()方法通过序列化和反序列化对象来创建一个深拷贝。这种方法需要对象及其所有引用的对象都实现Serializable接口。

区别

  • 浅拷贝仅复制对象本身和对象内的引用地址,不复制引用的对象。
  • 深拷贝则完全复制了整个对象及其引用的所有对象,新对象与原对象之间不共享任何内容。

使用场景

  • 使用浅拷贝当你需要一个与原对象共享部分数据的独立对象时。
  • 使用深拷贝当你需要一个完全独立于原对象的副本时,例如,当你要修改新对象而不影响原对象的内部状态时。

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

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

相关文章

基于光口的以太网 udp 回环实验

文章目录 前言一、系统框架整体设计二、系统工程及 IP 创建三、UDP回环模块修改说明四、接口讲解五、顶层模块设计六、下载验证前言 本章实验我们通过网络调试助手发送数据给 FPGA,FPGA通过光口接收数据并将数据使用 UDP 协议发送给电脑。 提示:任何文章不要过度深思!万事万…

从白子画到东方青苍,你选择谁来守护你的修仙之旅?

从白子画到东方青苍,你选择谁来守护你的修仙之旅? 在繁花似锦的修仙世界中&#xff0c;每一位追梦者都渴望有那么一位守护者&#xff0c;与你共患难&#xff0c;共成长。热血与浪漫交织的《花千骨》与《苍兰诀》&#xff0c;给我们带来了两位风华绝代的守护者&#xff1a;白子…

磁盘初始化会丢失文件吗?答案揭晓!

“由于我的电脑出现了一些问题&#xff0c;我就将磁盘初始化了&#xff0c;但是里面还有很重要的文件&#xff0c;磁盘初始化了文件会丢失吗&#xff1f;有什么方法可以恢复丢失的文件呢&#xff1f;” 当我们谈论磁盘初始化&#xff0c;通常是指对硬盘或固态驱动器&#xff08…

解决执行npm(或pnpm)时报:证书过期 certificate has expired问题

项目执行 pnpm install 初始化时报 reason: certificate has expired 错误。 解决方案 1、取消ssl验证&#xff1a;npm config set strict-ssl false这个方法一般就可以解决了。2、更换npm镜像源&#xff1a;npm config set registry http://registry.cnpmjs.org npm config …

第13节-简历中的开放性问题

(点击即可收听) 不少公司的开放式题目每年不会有太大的变化&#xff0c;所以在答题前可先去相关求职论坛看看这些公司往年的问题&#xff0c;分析和思考自己应当怎么回答 开放式问题回答技巧 开放式问题主要考察的是求职者的求职动机、解决问题的能力、创造力等软实力&#xff…

initdb: command not found【PostgreSQL】

如果您遇到 “initdb: command not found” 错误&#xff0c;说明 initdb 命令未找到&#xff0c;该命令用于初始化新的 PostgreSQL 数据库群集。这通常是因为 PostgreSQL 相关的工具未正确安装或者安装路径不在系统的 PATH 变量中。 以下是解决这个问题的一些建议&#xff1a…

linux|操作系统|centos7物理机安装网卡驱动8188gu(内核升级,firmware固件,USB设备管理,module管理)

前言&#xff1a; 目前服务器领域centos7基本是主流的操作系统&#xff0c;而linux相对于Windows来说&#xff0c;软硬件方面的支持是差很多的&#xff0c;在硬件方面来说&#xff0c;以一个免驱的网卡为例&#xff0c;window xp可能不会自动识别到&#xff0c;但Windows10基本…

wikijs在启动项目时遇到的问题

问题 使用PostgreSQL安装wikijs过程中&#xff0c;启动项目运行node server时&#xff0c;会报错如下&#xff1a; error: Database Initialization Error: create table "migrations" ("id" serial primary key, "name" varchar(255), "b…

JUC并发编程与源码分析学习笔记(二)

二十九、多线程锁之线程锁知识概述 说说Java“锁”事 从轻松的乐观锁和悲观锁开讲 通过8种情况演示锁运行案例&#xff0c;看看我们到底锁的是什么 公平锁和非公平锁 可重入锁&#xff08;又名递归锁&#xff09; 死锁及排查 写锁&#xff08;独占锁&#xff09;/读锁&a…

Java中创建List接口、ArrayList类和LinkedList类的常用方法(一)

List接口 要了解List接口&#xff0c;就不得不说起Java的集合框架。 &#xff08;该图来自菜鸟教程&#xff09; Collection接口和Map接口 Java 集合框架主要包括两种类型的容器&#xff0c;集合Collection和图Map。 Collection接口代表了单列集合&#xff0c;它包含了一组…

【知识---OpenCV库中的图像滤波算法作用】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言常见的图像滤波算法包括均值滤波、高斯滤波、中值滤波、双边滤波等&#xff0c;每种算法在不同的应用场景中都有其优劣之处。总结 前言 OpenCV&#xff08;Ope…

微信公众号怎么申请超过2个

一般可以申请多少个公众号&#xff1f;目前公众号申请数量的规定是从2018年底开始实施的&#xff0c;至今没有变化。规定如下&#xff1a;1、个人可以申请1个个人主体的公众号&#xff1b;2、企业&#xff08;有限公司&#xff09;可以申请2个公众号&#xff1b;3、个体户可以申…

MyBatis 的XML实现方法(JAVA)

数据库表的结构如下&#xff1a; DROP DATABASE IF EXISTS test; CREATE DATABASE test DEFAULT CHARACTER SET utf8mb4; -- 使⽤数据数据 USE test; -- 创建表[⽤⼾表] DROP TABLE IF EXISTS userinfo; CREATE TABLE userinfo ( id INT ( 11 ) NOT NULL AUTO_INCREMENT, user…

如何本地搭建Splunk Enterprise数据平台并实现任意浏览器公网访问

文章目录 前言1. 搭建Splunk Enterprise2. windows 安装 cpolar3. 创建Splunk Enterprise公网访问地址4. 远程访问Splunk Enterprise服务5. 固定远程地址 前言 本文主要介绍如何简单几步&#xff0c;结合cpolar内网穿透工具实现随时随地在任意浏览器&#xff0c;远程访问在本地…

MacM1Pro Parallels19.1.0 CentOS7.9 Install PostgrepSQL

相关阅读 MacM1Pro安装 Parallels Desktop 19.1.0 https://blog.csdn.net/qq_41594280/article/details/135420241 MacM1Pro Parallels安装Parallels Tools https://blog.csdn.net/qq_41594280/article/details/135398780 MacM1Pro Parallels安装CentOS7.9 https://blog.csdn.n…

win7或win10如何设置休眠不断网

win7电脑一断休眠wifi网络就会断&#xff0c;那么怎么办呢?该如何设置Win7电脑休眠时不断开WiFi呢?怎么办呢&#xff1f;下面为大家介绍一下方法能使大脑休眠时不断开WiFi网络。 设置Win7电脑休眠时不断开WiFi教程如下&#xff1a; 1、首先点击桌面右下角的.无线图标&#xf…

[嵌入式软件][启蒙篇][仿真平台] STM32F103实现串口输出输入、ADC采集

上一篇&#xff1a;[嵌入式软件][启蒙篇][仿真平台] STM32F103实现LED、按键 文章目录 一、串口输出(1) 简介(2) 示例代码(3) 仿真效果 二、串口输入(1) 简介(2) 示例代码(3) 仿真效果 三、ADC采集(1) 简介(2) 示例代码&#xff08;电压&#xff09;(3) 仿真效果 &#xff08;…

Conda python管理环境environments 一 从入门到精通

Conda系列&#xff1a; 翻译: Anaconda 与 miniconda的区别Miniconda介绍以及安装Conda python运行的包和环境管理 入门 使用 conda&#xff0c;可以创建、导出、列出、删除和更新 具有不同 Python 版本和/或 安装在其中的软件包。在两者之间切换或移动 环境称为激活环境。您…

JavaEE学习笔记 2024-1-17 --请求转发和重定向、MVC设计模式

上一篇 个人整理非商业用途&#xff0c;欢迎探讨与指正&#xff01;&#xff01; 文章目录 7.请求转发和重定向7.1重定向7.2请求转发7.3注意 8.项目的地址9.MVC设计模式9.1MVC设计模式和三层架构的区别9.1.1MVC的三层9.1.2三层架构的三层 9.2JavaWEB的两个时期9.2.1JSP Model19…

vue中的插槽

在vue中&#xff0c;有的名词听着高大上&#xff0c;挺怪异的&#xff0c;比如插槽&#xff0c;就是slot&#xff0c;它的作用是为了解决组件之间写的内容在组件中的使用问题。 一、插槽的作用 <!DOCTYPE html> <html> <head><title>Vue中的插槽</…