java-克隆应用
5.2 创建复杂对象 对于某些复杂对象,通过克隆来创建其副本比通过构造函数创建新实例更加高效。例如,当对象包含大量字段或需要进行复杂初始化时,克隆可以显著提高性能。
java 复制代码 class ComplexObject implements Cloneable { private int[] data;
public ComplexObject(int size) {// 复杂初始化过程data = new int[size];for (int i = 0; i < size; i++) {data[i] = i;}
}@Override
protected Object clone() throws CloneNotSupportedException {return super.clone();
}@Override
public String toString() {return "ComplexObject{data=" + Arrays.toString(data) + "}";
}public static void main(String[] args) {try {ComplexObject obj1 = new ComplexObject(10);Complex
继续
ChatGPT java 复制代码 Object obj2 = (ComplexObject) obj1.clone(); System.out.println(obj1); // 输出:ComplexObject{data=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]} System.out.println(obj2); // 输出:ComplexObject{data=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]} } catch (CloneNotSupportedException e) { e.printStackTrace(); } } } 在上述代码中,通过克隆方式创建了ComplexObject的副本。对于复杂对象,通过克隆可以避免重复复杂的初始化过程,从而提高性能。
Object obj2 = (ComplexObject) obj1.clone();System.out.println(obj1); // 输出:ComplexObject{data=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}System.out.println(obj2); // 输出:ComplexObject{data=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}} catch (CloneNotSupportedException e) {e.printStackTrace();}}
}
在上述代码中,通过克隆方式创建了ComplexObject
的副本。对于复杂对象,通过克隆可以避免重复复杂的初始化过程,从而提高性能。
6. 克隆的注意事项
在使用克隆机制时,有一些注意事项需要特别留意,以避免潜在的问题。
6.1 克隆方法的覆盖
当一个类实现Cloneable
接口时,必须覆盖Object
类的clone
方法,并将其可见性提高到public
。默认的clone
方法是受保护的(protected),所以直接调用会导致编译错误。
class MyClass implements Cloneable {@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}
}
6.2 深拷贝的实现
对于包含引用类型字段的类,使用默认的clone
方法进行浅拷贝可能会导致共享引用对象,从而引发不必要的修改。需要根据需求手动实现深拷贝。
6.3 CloneNotSupportedException
异常
在调用clone
方法时,可能会抛出CloneNotSupportedException
异常。为了避免这个异常,类必须实现Cloneable
接口。
public class Main {public static void main(String[] args) {try {MyClass obj = new MyClass();MyClass clonedObj = (MyClass) obj.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}}
}class MyClass implements Cloneable {@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}
}
6.4 序列化和反序列化
使用序列化和反序列化实现深拷贝时,需要确保所有嵌套对象都实现了Serializable
接口。否则会在序列化过程中抛出NotSerializableException
异常。
class MyClass implements Serializable {private static final long serialVersionUID = 1L;// 类的内容
}
7. 克隆的最佳实践
7.1 使用Copy Constructor
在某些情况下,使用复制构造函数(Copy Constructor)比克隆更加简洁和易于理解。复制构造函数通过参数接受另一个同类对象,并复制其字段。
class Person {String name;int age;Person(String name, int age) {this.name = name;this.age = age;}// 复制构造函数Person(Person other) {this.name = other.name;this.age = other.age;}
}public class Main {public static void main(String[] args) {Person person1 = new Person("Alice", 25);Person person2 = new Person(person1);System.out.println(person1.name); // 输出:AliceSystem.out.println(person2.name); // 输出:Alice}
}
复制构造函数提供了一种更显式的方式来实现对象的复制,避免了Cloneable
接口和clone
方法带来的复杂性。
7.2 使用Builder模式
对于复杂对象的创建,Builder模式提供了一种灵活且可读性好的解决方案。通过Builder模式,可以逐步构建对象,并在构建过程中进行复制。
class Person {private String name;private int age;private String address;private Person(Builder builder) {this.name = builder.name;this.age = builder.age;this.address = builder.address;}public static class Builder {private String name;private int age;private String address;public Builder setName(String name) {this.name = name;return this;}public Builder setAge(int age) {this.age = age;return this;}public Builder setAddress(String address) {this.address = address;return this;}public Person build() {return new Person(this);}// 复制构造方法public Builder copy(Person person) {this.name = person.name;this.age = person.age;this.address = person.address;return this;}}
}public class Main {public static void main(String[] args) {Person person1 = new Person.Builder().setName("Alice").setAge(25).setAddress("New York").build();Person person2 = new Person.Builder().copy(person1).setAddress("Los Angeles").build();System.out.println(person1.address); // 输出:New YorkSystem.out.println(person2.address); // 输出:Los Angeles}
}
在上述代码中,通过Builder模式实现了对象的创建和复制,提供了一种灵活的解决方案。
总结
克隆在Java中是一个重要的技术,用于创建对象的副本。通过实现Cloneable
接口和重写clone
方法,可以实现对象的浅拷贝和深拷贝。浅拷贝只复制对象的基本类型字段和引用类型字段的引用,而深拷贝则递归地复制所有引用对象。序列化和反序列化提供了一种实现深拷贝的有效方法。
在实际应用中,原型模式、创建复杂对象和避免不必要的初始化是克隆的常见使用场景。然而,克隆也有其局限性和注意事项,例如必须实现Cloneable
接口、处理CloneNotSupportedException
异常等。
在许多情况下,使用复制构造函数和Builder模式可以提供更简洁和灵活的对象复制方法。这些模式避免了克隆机制的复杂性,并提高了代码的可读性和可维护性。
通过深入理解克隆的概念、实现方式和应用场景,开发者可以更好地利用克隆技术来优化Java应用程序的性能和结构。
相关文章:
java-克隆应用
5.2 创建复杂对象 对于某些复杂对象,通过克隆来创建其副本比通过构造函数创建新实例更加高效。例如,当对象包含大量字段或需要进行复杂初始化时,克隆可以显著提高性能。 java 复制代码 class ComplexObject implements Cloneable { private …...

RPC协议
3.8 既然有 HTTP 协议,为什么还要有 RPC 假设我们需要在 A 电脑的进程发一段数据到 B 电脑的进程,我们一般会在代码里使用 Socket 进行编程。 这时候,我们可选项一般也就 TCP 和 UDP 二选一。TCP 可靠,UDP 不可靠。 类似下面这…...

医疗器械3D全景展会在线漫游创造数字化时代的展览新篇章
在数字化浪潮的引领下,VR虚拟网上展会正逐渐成为企业展示品牌实力、吸引潜在客户的首选平台。我们与广交会携手走过三年多的时光,凭借优质的服务和丰富的经验,赢得了客户的广泛赞誉。 面对传统展会活动繁多、企业运营繁忙的挑战,许…...
IP_Endpoint类型在CAPL中的使用
在使用TCP/IP协议栈通信时,创建Socket套接字调用接口函数实现通信的整个过程成为一种主流且便捷的方式。在CAPL中,Client需要创建TCP或UDP套接字,绑定自己的IP地址和一个端口号,作为自己的通信端点。 on key c {clientsocket = tcpOpen(ipGetAddressAsNumber("192.16…...

数据资产与用户体验优化:深入挖掘用户数据,精准分析用户需求与行为,优化产品与服务,提升用户体验与满意度,打造卓越的用户体验,赢得市场认可
一、引言 在数字化时代,数据已经成为企业最宝贵的资产之一。通过深入挖掘和分析用户数据,企业能够精准把握用户需求和行为,从而优化产品与服务,提升用户体验和满意度。这不仅有助于企业在激烈的市场竞争中脱颖而出,还…...

基于TCAD与紧凑模型结合方法探究陷阱对AlGaN/GaN HEMTs功率附加效率及线性度的影响
来源:Investigation of Traps Impact on PAE and Linearity of AlGaN/GaN HEMTs Relying on a Combined TCAD–Compact Model Approach(TED 24年) 摘要 本文提出了一种新型建模方法,用于分析GaN HEMTs的微波功率性能。通过结合工…...
具身智能概念
具身智能作为人工智能发展的一个重要分支,伴随着大模型技术的爆发与硬件成本的降低,即软硬件技术走向成熟,正在成为广泛关注的热门,一时之间,具身智能机器人也成为了科技界新的风向标。 什么是具身智能? …...

C++ 43 之 自增运算符的重载
#include <iostream> #include <string> using namespace std;class MyInt{friend ostream& operator<< (ostream& cout , MyInt& int1); public:MyInt(){this->m_num 0;}// 前置自增: 成员函数实现运算符的重载 返回的是 引用&a…...

计算机网络:1概述、2物理层
目录 概述因特网网络、互连网(互联网)与因特网的区别与关系因特网发展的三个阶段因特网服务提供者(Internet Service Provider,ISP)因特网的标准化工作因特网的管理结构 三种交换电路交换分组交换报文交换 计算机网络性…...

【Ardiuno】实验使用ESP32接收电脑发送的串口数据(图文)
使用ESP32可以非常方便的与电脑进行串口通讯,一般我们可以用串口接收ESP32的输出作为调试使用,今天我们再来实验一下从电脑端向ESP32单片机发送数据。 发送数据程序代码: void setup() {Serial.begin(9600); }void loop() { if(Serial.ava…...

思科ospf+rip重发布配置命令
——————————————————————————————————————————— 基础配置 R1 Router>en #进入配置模式 Router#conf #进入配置模式 Router(config)#h…...

椭圆的矩阵表示法
椭圆的矩阵表示法 flyfish 1. 标准几何表示法 标准几何表示法是通过椭圆的几何定义来表示的: x 2 a 2 y 2 b 2 1 \frac{x^2}{a^2} \frac{y^2}{b^2} 1 a2x2b2y21其中, a a a 是椭圆的长半轴长度, b b b 是椭圆的短半轴长度。 2.…...

智慧乡村和美人家信息化系统
一、简介 智慧乡村和美人家信息化系统是一个综合管理平台,集成了首页概览、一张图可视化、数据填报、智能评估、便捷申报、公开公示、任务管理、活动发布和灵活配置等功能。该系统不仅提升了乡村管理效率,也优化了家庭生活的便捷性。通过一张图…...
ios-deploy - Required for installing your app on a physical device with the CLI
ios-deploy 是一个用于在 iOS 设备上安装、调试和运行 iOS 应用的开源工具。如果你正在使用命令行界面(CLI)来部署 React Native 或其他原生 iOS 应用到物理设备,那么安装 ios-deploy 是必要的。 以下是安装 ios-deploy 的一般步骤ÿ…...

thinkphp5使用模型删除与复杂查询EXP
模型删除 应用软删除 表中需要有字段,deletetime 模型中使用下面方法 use SoftDelete;protected $deleteTime delete_time;真实删除 // 软删除 User::destroy(1); // 真实删除 User::destroy(1,true); $user User::get(1); // 软删除 $user->delete(); // 真…...
铜陵市省重点实验室、省工程技术研究中心认定奖励补贴和申报认定条件流程归集
本文介绍铜陵市省重点实验室、省工程技术研究中心认定奖励补贴和申报认定条件等内容,详情如下,需要申报的可指导! 铜陵市省重点实验室、省工程技术研究中心认定奖励补贴(2023年发布) 对新认定的国家重点实验室、国家…...

Linux-目录和文件
目录 一、Linux目录 1、Linux常见目录 2、常见的Linux文件类型 二、cat-查看文件命令 1、cat命令用法 三、分页查看文件内容 1、 more命令 2、less命令 3、more和less的区别 四、查看文件开头或末尾 1、head命令 2、tail命令 3、wc-统计文件内容 4、grep 命令…...

2024-06月 | 维信金科 | 风控数据岗位推荐,高收入岗位来袭!
今日推荐岗位:策略分析经理/分析专家、贷前、中策略分析、风控模型分析。 风控部门是金融业务的核心部门,而从事风控行业的人即称之为风险管理者。是大脑,是最最最重要的部门之一。今日推荐岗位的核心技能分布如下: 简历发送方式…...

不适合编程的人是怎样的?
你知道不适合编程的人是怎样的吗?其实,对编程没有兴趣的人往往都不适合从事编程工作。编程并非是一项轻松简单的任务,它需要投入大量的时间和精力。 编程领域有其独特的特点和要求。首先,编程有着相当陡峭的学习曲线。从最基础的语…...

el-table表格变更前后根据数据值改变背景颜色
需求: 1.左侧变更前表格数据不可以编辑,并且背景色加灰 2.右侧变更后表格数据可被编辑,编辑后变更前与变更后行数据不一致,添加背景色区分 3.点击删除的时候,给变更后表格当前行,添加背景色和删除的中横…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...