Java深拷贝和浅拷贝区别?

大家好,我是锋哥。今天分享关于【Java深拷贝和浅拷贝区别?】面试题。希望对大家有帮助;

Java深拷贝和浅拷贝区别?

1000道 互联网大厂Java工程师 精选面试题-Java资源分享网

在Java中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种常用的对象复制方式。它们的区别主要体现在复制过程中,引用类型字段的处理方式不同。下面详细介绍它们的区别:

1. 浅拷贝(Shallow Copy)

  • 定义:浅拷贝指的是创建一个新的对象,但该对象中的引用类型字段(例如对象类型的成员变量)依然指向原对象的内存地址。也就是说,拷贝的是对象的引用,而不是对象所引用的内容。

  • 特征

    • 如果一个对象包含引用类型字段,那么浅拷贝会复制这些引用字段的地址,而不是复制它们所指向的对象。
    • 对于基本类型字段,浅拷贝会直接复制值。
    • 因此,原对象和拷贝对象中的引用类型字段会指向同一块内存,若修改其中一个对象的引用字段,可能会影响到另一个对象。
  • 实现方式

    • 使用 Object.clone() 方法或者手动复制字段。
  • 示例

    class Person {String name;int age;Person(String name, int age) {this.name = name;this.age = age;}
    }class ShallowCopyExample {public static void main(String[] args) {Person person1 = new Person("John", 25);Person person2 = person1; // 浅拷贝,只是复制引用// 修改 person2person2.name = "Jane";System.out.println(person1.name); // 输出: JaneSystem.out.println(person2.name); // 输出: Jane}
    }
    

    在上面的例子中,person1person2 指向同一个 Person 对象。因此,修改 person2 的字段会影响到 person1

2. 深拷贝(Deep Copy)

  • 定义:深拷贝指的是创建一个新的对象,并且递归地复制对象所引用的所有对象。也就是说,不仅复制对象本身,还复制对象中引用的所有对象,最终得到的拷贝是完全独立的,修改原对象或拷贝对象都不会互相影响。

  • 特征

    • 对于基本类型字段,深拷贝会直接复制其值。
    • 对于引用类型字段,深拷贝会创建新的对象并复制引用类型字段所指向的内容,从而保证原对象和拷贝对象完全独立。
    • 适用于复杂对象或者多级嵌套对象的复制,确保数据的完全隔离。
  • 实现方式

    • 通常需要手动实现深拷贝方法,或者通过序列化(序列化 + 反序列化)来实现深拷贝。
    • 使用 Object.clone() 方法时,如果对象内含有引用类型字段,需要覆盖 clone() 方法来实现深拷贝。
  • 示例

    class Person {String name;int age;Person(String name, int age) {this.name = name;this.age = age;}// 深拷贝public Person deepCopy() {return new Person(this.name, this.age);}
    }class DeepCopyExample {public static void main(String[] args) {Person person1 = new Person("John", 25);Person person2 = person1.deepCopy(); // 深拷贝,创建一个新对象// 修改 person2person2.name = "Jane";System.out.println(person1.name); // 输出: JohnSystem.out.println(person2.name); // 输出: Jane}
    }
    

    在这个例子中,person2 是通过 deepCopy() 方法创建的深拷贝对象。修改 person2 的字段不会影响 person1,因为它们是完全独立的对象。

3. 总结对比

区别浅拷贝深拷贝
复制对象的方式只复制对象本身,引用类型字段仍指向原对象的内存复制对象本身,并递归地复制引用类型字段指向的对象
修改影响修改拷贝对象的引用类型字段会影响原对象修改拷贝对象不会影响原对象
性能通常较快,因为只复制对象引用性能较差,因为需要复制整个对象图
实现方式可以使用 clone() 或手动复制字段通常需要手动实现,或者通过序列化技术

4. 注意事项

  • 如果对象中的字段类型是基本类型(如 intchar 等),浅拷贝和深拷贝效果相同,因为这些字段直接存储值而不是引用。

  • 对于包含嵌套对象的复杂对象,深拷贝会更加重要,因为浅拷贝无法有效防止对象之间的共享引用导致的潜在问题。

  • 在 Java 中,如果想要实现深拷贝,有时可以借助 Java 的序列化机制(将对象序列化为字节流,再反序列化为一个新的对象)来完成,特别是对于复杂对象的深拷贝。

    例如:

    import java.io.*;public class DeepCopyExample {public static Object deepCopy(Object obj) {try {// 写入当前对象的字节流ByteArrayOutputStream byteStream = new ByteArrayOutputStream();ObjectOutputStream objectStream = new ObjectOutputStream(byteStream);objectStream.writeObject(obj);objectStream.flush();// 通过字节流读取并返回新的对象ByteArrayInputStream inputByteStream = new ByteArrayInputStream(byteStream.toByteArray());ObjectInputStream objectInputStream = new ObjectInputStream(inputByteStream);return objectInputStream.readObject();} catch (IOException | ClassNotFoundException e) {e.printStackTrace();return null;}}public static void main(String[] args) {// 使用序列化进行深拷贝Person person1 = new Person("John", 25);Person person2 = (Person) deepCopy(person1); // 深拷贝person2.name = "Jane";  // 修改 person2System.out.println(person1.name); // 输出: JohnSystem.out.println(person2.name); // 输出: Jane}
    }
    

通过这种方法,能够确保对象被完全深拷贝。

希望这些解释对你理解 Java 中的深拷贝和浅拷贝有所帮助!

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

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

相关文章

Linux文件属性 --- 硬链接、所有者、所属组

三、硬链接数 1.目录 使用“ll”命令查看,在文件权限的后面有一列数字,这是文件的硬链接数。 对于目录,硬链接的数量是它具有的直接子目录的数量加上其父目录和自身。 下图的“qwe”目录就是“abc”目录的直接子目录。 2.文件 对于文件可…

MobileLLM开发安卓AI的体验(一)

MobileLLM是一个在安卓端跑的大语言模型,关键它还有调动api的能力 https://github.com/facebookresearch/MobileLLM 项目地址是这个。 看了下,似乎还是中国人团队 article{liu2024mobilellm, title{MobileLLM: Optimizing Sub-billion Parameter Langua…

【WRF安装】WRF编译错误总结1:HDF5库包安装

目录 1 HDF5库包安装有误:HDF5 not set in environment. Will configure WRF for use without.HDF5的重新编译 错误原因1:提示 overflow 错误1. 检查系统是否缺少依赖库或工具2. 检查和更新编译器版本3. 检查 ./configure 报错信息4. 检查系统环境变量5.…

大模型微调---Prompt-tuning微调

目录 一、前言二、Prompt-tuning实战2.1、下载模型到本地2.2、加载模型与数据集2.3、处理数据2.4、Prompt-tuning微调2.5、训练参数配置2.6、开始训练 三、模型评估四、完整训练代码 一、前言 Prompt-tuning通过修改输入文本的提示(Prompt)来引导模型生…

【UE5】pmx导入UE5,套动作。(防止“气球人”现象。

参考视频:UE5Animation 16: MMD模型與動作導入 (繁中自動字幕) 问题所在: 做法记录(自用) 1.导入pmx,删除这两个。 2.转换给blender,清理节点。 3.导出时,内嵌贴图,选“复制”。 …

005 QT常用控件Qwidget_上

文章目录 前言控件概述QWidgetenable属性geometry属性windowTitle属性windowlcon属性 小结 前言 本文将会向你介绍常用的Qwidget属性 控件概述 Widget 是 Qt 中的核心概念. 英文原义是 “⼩部件”, 我们此处把它翻译为 “控件” . 控件是构成⼀个图形化界面的基本要素. QWi…

gitlab初始化+API批量操作

几年没接触gitlab了,新版本装完以后代码提交到默认的main分支,master不再是主分支 项目有几十个仓库,研发提交代码后仓库地址和之前的发生了变化 有几个点 需要注意 1、修改全局默认分支 2、关闭分支保护 上面修改了全局配置不会影响已经创…

如何用上AI视频工具Sora,基于ChatGPT升级Plus使用指南

没有GPT,可以参考这个教程:详情移步至底部参考原文查看哦~ 1.准备工作 详情移步至底部参考原文查看哦~ 详情移步至底部参考原文查看哦~ 4.Sora使用 详情移步至底部参考原文查看哦 参考文章:【包教包会】如何用上AI视频工具Sora&#xff…

如何查看K8S集群中service和pod定义的网段范围

在我们创建部署K8S集群的开头时候 不是需要在master节点上执行一条这样的命令嘛? kubeadm init --apiserver-advertise-address192.168.60.130 --control-plane-endpointcluster-master --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers -…

使用 Marp 将 Markdown 导出为 PPT 后不可编辑的原因说明及解决方案

Marp 是一个流行的 Markdown 演示文稿工具,能够将 Markdown 文件转换为 PPTX 格式。然而,用户在使用 Marp 导出 PPT 时,可能会遇到以下问题: 导出 PPT 不可直接编辑的原因 根据 Marp GitHub 讨论,Marp 导出的 PPTX 文…

redis 缓存使用

工具类 package org.springblade.questionnaire.redis;import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factor…

level2逐笔委托查询接口

沪深逐笔委托队列查询 前置步骤 分配数据库服务器 查询模板 以下是沪深委托队列查询的请求模板&#xff1a; http://<数据库服务器>/sql?modeorder_book&code<股票代码>&offset<offset>&token<token>查询参数说明 参数名类型说明mo…

游戏AI实现-寻路算法(DFS)

​深度优先搜索算法&#xff08;英语&#xff1a;Depth-First-Search&#xff0c;缩写为DFS&#xff09;是一种用于遍历或搜索树或图的算法。 寻路地图搭建&#xff1a; 游戏AI实现-寻路地图搭建-CSDN博客 算法过程&#xff1a;遍历方向为从竖直向上沿顺时针方向 1.首先将开…

Yolov3源码解析

1. 制作数据集 我做的是三目标检测&#xff0c;人狗马目标检测 然后使用精力标注助手对图像进行目标标注。到出为xml文件。 得到这样格式的数据集 1. 1 读取xml文件&#xff0c;求建议框&#xff0c;向量数据库 import os from xml.dom.minidom import parse from kmeans im…

《变形金刚:赛博坦的陨落》游戏启动难题:‘buddha.dll’缺失的七大修复策略

《变形金刚&#xff1a;赛博坦的陨落》游戏启动时提示buddha.dll缺失&#xff1a;原因与解决方案 作为一名软件开发从业者&#xff0c;我在日常工作中经常遇到电脑游戏运行时出现的各种问题&#xff0c;如文件丢失、文件损坏和系统报错等。今天&#xff0c;我们就来探讨一下《…

java全栈day16--Web后端实战(数据库)

一、数据库介绍 二、Mysql安装&#xff08;自行在网上找&#xff0c;教程简单&#xff09; 安装好了进行Mysql连接 连接语法&#xff1a;winr输入cmd&#xff0c;在命令行中再输入mysql -uroot -p密码 方法二&#xff1a;winr输入cmd&#xff0c;在命令行中再输入mysql -uroo…

简单配置,全面保护:HZERO审计服务让安全触手可及

HZERO技术平台&#xff0c;凭借多年企业资源管理实施经验&#xff0c;深入理解企业痛点&#xff0c;为您提供了一套高效易用的审计解决方案。这套方案旨在帮助您轻松应对企业开发中的审计挑战&#xff0c;确保业务流程的合规性和透明度。 接下来&#xff0c;我将为大家详细介绍…

Microi吾码|开源低代码.NET、VUE低代码项目,表单引擎介绍

Microi吾码&#xff5c;开源低代码.NET、VUE低代码项目&#xff0c;表单引擎介绍 一、摘要二、Microi吾码介绍2.1 功能介绍2.2 团队介绍2.3 上线项目案例 三、Microi吾码表单引擎是什么&#xff1f;四、Microi吾码表单引擎功能4.1 模块引擎 - 由表单引擎驱动4.2 流程引擎 - 由表…

Spring Cloud Sleuth 分布式链路追踪入门

您好&#xff0c;我是今夜写代码,今天学习下分布式链路组件Spring Cloud Sleuth。 本文内容 介绍了分布式链路的思想 Sleuth 和 Zipkin 简单集成Demo,并不涉及 Sleuth原理。 为什么要用链路追踪&#xff1f; 微服务架构下&#xff0c;一个复杂的电商应用&#xff0c;完成下…

低级计算机网络知识总结

1 应用层 1.1 HTTP(TCP) 浏览器访问WWW服务器过程&#xff1a;首先进行域名解析&#xff0c;然后通过TCP向服务器发送连接请求 HTTP本身是无连接&#xff0c;无状态的。无状态特性使服务器能够支持大量的并发HTTP请求。实际应用中&#xff0c;通常使用Cookie加数据库跟踪用户…