java的深拷贝和浅拷贝

devtools/2024/9/23 8:30:59/

总结:

深拷贝:无论是基本类型还是引用类型都会创建新的实例。

浅拷贝:对于基本类型就是复制其值,对于引用类型则是复制了指向这些数据类型的内存地址。

浅拷贝(Shallow Copy)

浅拷贝是指在创建新对象时,对于对象中的基本数据类型的成员变量会复制其值,而对于引用类型成员变量则只复制其引用,也就是说新旧对象共享同一个引用类型成员变量指向的对象。如果通过新对象修改了引用类型成员变量指向的对象,那么原对象也会受到影响。

Java中实现浅拷贝的一种常见方式是通过Object类的clone()方法。需要注意的是,clone()方法是受保护的,所以通常需要在类中重写此方法并声明为public,同时还需要实现Cloneable接口。但这种方式仅能实现浅拷贝。

深拷贝(Deep Copy)

深拷贝则是完全复制对象及其所有引用类型成员变量指向的对象,即不仅复制引用本身,还复制引用指向的对象。这意味着新对象和原对象以及各自的所有引用类型成员变量指向的对象都是相互独立的,修改其中一个对象不会影响另一个对象。

Java中实现深拷贝有几种常见方式:

  1. 序列化(Serialization)实现深拷贝最常用的方式之一是利用Java的序列化机制。对象实现Serializable接口后,可以通过序列化和反序列化过程完成深拷贝。这种方法会将对象及其所有引用类型成员变量指向的对象全部复制一份。

  2. 构造函数另一种实现深拷贝的方式是在类中定义一个构造函数,该构造函数接受同类型的一个对象作为参数,然后在构造函数中逐个复制成员变量,包括递归地复制引用类型成员变量指向的对象。

  3. 复制对象的属性对于简单对象,可以手动编写代码来复制对象的每个属性,包括递归复制引用类型成员变量指向的对象。

  4. 使用第三方库也可以使用像Apache Commons Lang库中的org.apache.commons.lang3.SerializationUtils类提供的copy(Object)方法来实现深拷贝。

总的来说,选择浅拷贝还是深拷贝取决于具体的应用场景和需求。浅拷贝适用于不需要完全独立副本的情况,而深拷贝则适用于需要完全独立副本,且对象内部可能包含其他复杂对象的情况。


http://www.ppmy.cn/devtools/52276.html

相关文章

微调大模型 - 面向学术论文的AI大模型

1、优化学术交流: 该项目专注于优化学术文献的阅读、润色和写作过程,提供了实用化的交互接口。 2、模块化和可扩展性: 项目设计模块化,支持自定义快捷按钮和函数插件,便于用户根据自己的需求进行扩展。 3、多语言和多模型支持: 支持多种语言的论文翻译和总结,同时可以并行…

今日AI资讯-20240615

1. Follow Your Emoji 一键让照片变表情包 腾讯混元联合港科大、清华大学联合推出肖像动画生成框架Follow Your Emoji,可以通过人脸骨架信息生成任意风格的脸部动画,一键创建表情包。基于算法革新和数据积累,Follow Your Emoji可以支持对脸部…

Netty中的Reactor模型实现

Netty版本:4.1.17 Reactor模型是Doug Lea在《Scalable IO in Java》提出的,主要是针对NIO的。 其中的主从Reactor模式在Netty中的配置如下: EventLoopGroup bossGroup new NioEventLoopGroup(1); EventLoopGroup workerGroup new NioEv…

《软件定义安全》之八:软件定义安全案例

第8章 软件定义安全案例 1.国外案例 1.1 Fortinet:传统安全公司的软件定义方案 Fortinet的软件定义安全架构强调与数据中心的结合,旨在将安全转型为软件定义的模式,使安全运维能够与数据中心的其他部分一样灵活、弹性。在Fortinet看来&…

复合语句、数值交换、三个数的最值与排序

例1&#xff1a;运行下列程序&#xff0c;输入5&#xff0c;观察运行结果并思考程序是怎样运行的。 #include<bits/stdc.h> using namespace std; int main() { int n,a0,b0,c0; cin>>n; if(n<0) aa2; bb2; cc2; cout<<a<<" "<&l…

Go微服务: 分布式之发送带有事务消息的示例

分布式之发送带有事务消息 现在做一个RocketMQ的事务消息的 demo 1 &#xff09;生产者 package mainimport ("context""fmt""time""github.com/apache/rocketmq-client-go/v2""github.com/apache/rocketmq-client-go/v2/prim…

WebSocket 快速入门 与 应用

WebSocket 是一种在 Web 应用程序中实现实时、双向通信的技术。它允许客户端和服务器之间建立持久性的连接&#xff0c;以便可以在两者之间双向传输数据。 以下是 WebSocket 的一些关键特点和工作原理&#xff1a; 0.特点&#xff1a; 双向通信&#xff1a;WebSocket 允许服务…

Flutter 实现dispose探测控件

文章目录 前言一、什么是dispose探测控件&#xff1f;1、通常情况2、使用dispose探测控件 二、如何实现1、继承StatefulWidget2、定义dipose回调3、定义child4、重载Dispose方法5、build child 三、完整代码四、使用示例1、基本用法2、设置定义数据 总结 前言 开发flutter一般…