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.点击删除的时候,给变更后表格当前行,添加背景色和删除的中横…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...