当前位置: 首页 > news >正文

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 创建复杂对象 对于某些复杂对象&#xff0c;通过克隆来创建其副本比通过构造函数创建新实例更加高效。例如&#xff0c;当对象包含大量字段或需要进行复杂初始化时&#xff0c;克隆可以显著提高性能。 java 复制代码 class ComplexObject implements Cloneable { private …...

RPC协议

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

医疗器械3D全景展会在线漫游创造数字化时代的展览新篇章

在数字化浪潮的引领下&#xff0c;VR虚拟网上展会正逐渐成为企业展示品牌实力、吸引潜在客户的首选平台。我们与广交会携手走过三年多的时光&#xff0c;凭借优质的服务和丰富的经验&#xff0c;赢得了客户的广泛赞誉。 面对传统展会活动繁多、企业运营繁忙的挑战&#xff0c;许…...

IP_Endpoint类型在CAPL中的使用

在使用TCP/IP协议栈通信时,创建Socket套接字调用接口函数实现通信的整个过程成为一种主流且便捷的方式。在CAPL中,Client需要创建TCP或UDP套接字,绑定自己的IP地址和一个端口号,作为自己的通信端点。 on key c {clientsocket = tcpOpen(ipGetAddressAsNumber("192.16…...

数据资产与用户体验优化:深入挖掘用户数据,精准分析用户需求与行为,优化产品与服务,提升用户体验与满意度,打造卓越的用户体验,赢得市场认可

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

基于TCAD与紧凑模型结合方法探究陷阱对AlGaN/GaN HEMTs功率附加效率及线性度的影响

来源&#xff1a;Investigation of Traps Impact on PAE and Linearity of AlGaN/GaN HEMTs Relying on a Combined TCAD–Compact Model Approach&#xff08;TED 24年&#xff09; 摘要 本文提出了一种新型建模方法&#xff0c;用于分析GaN HEMTs的微波功率性能。通过结合工…...

具身智能概念

具身智能作为人工智能发展的一个重要分支&#xff0c;伴随着大模型技术的爆发与硬件成本的降低&#xff0c;即软硬件技术走向成熟&#xff0c;正在成为广泛关注的热门&#xff0c;一时之间&#xff0c;具身智能机器人也成为了科技界新的风向标。 什么是具身智能&#xff1f; …...

C++ 43 之 自增运算符的重载

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

计算机网络:1概述、2物理层

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

【Ardiuno】实验使用ESP32接收电脑发送的串口数据(图文)

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

思科ospf+rip重发布配置命令

——————————————————————————————————————————— 基础配置 R1 Router>en #进入配置模式 Router#conf #进入配置模式 Router(config)#h…...

椭圆的矩阵表示法

椭圆的矩阵表示法 flyfish 1. 标准几何表示法 标准几何表示法是通过椭圆的几何定义来表示的&#xff1a; x 2 a 2 y 2 b 2 1 \frac{x^2}{a^2} \frac{y^2}{b^2} 1 a2x2​b2y2​1其中&#xff0c; a a a 是椭圆的长半轴长度&#xff0c; b b b 是椭圆的短半轴长度。 2.…...

智慧乡村和美人家信息化系统

一、简介 智慧乡村和美人家信息化系统是一个综合管理平台&#xff0c;集成了首页概览、一张图可视化、数据填报、智能评估、便捷申报、公开公示、任务管理、活动发布和灵活配置等功能。该系统不仅提升了乡村管理效率&#xff0c;也优化了家庭生活的便捷性。通过一张图&#xf…...

ios-deploy - Required for installing your app on a physical device with the CLI

ios-deploy 是一个用于在 iOS 设备上安装、调试和运行 iOS 应用的开源工具。如果你正在使用命令行界面&#xff08;CLI&#xff09;来部署 React Native 或其他原生 iOS 应用到物理设备&#xff0c;那么安装 ios-deploy 是必要的。 以下是安装 ios-deploy 的一般步骤&#xff…...

thinkphp5使用模型删除与复杂查询EXP

模型删除 应用软删除 表中需要有字段&#xff0c;deletetime 模型中使用下面方法 use SoftDelete;protected $deleteTime delete_time;真实删除 // 软删除 User::destroy(1); // 真实删除 User::destroy(1,true); $user User::get(1); // 软删除 $user->delete(); // 真…...

铜陵市省重点实验室、省工程技术研究中心认定奖励补贴和申报认定条件流程归集

本文介绍铜陵市省重点实验室、省工程技术研究中心认定奖励补贴和申报认定条件等内容&#xff0c;详情如下&#xff0c;需要申报的可指导&#xff01; 铜陵市省重点实验室、省工程技术研究中心认定奖励补贴&#xff08;2023年发布&#xff09; 对新认定的国家重点实验室、国家…...

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月 | 维信金科 | 风控数据岗位推荐,高收入岗位来袭!

今日推荐岗位&#xff1a;策略分析经理/分析专家、贷前、中策略分析、风控模型分析。 风控部门是金融业务的核心部门&#xff0c;而从事风控行业的人即称之为风险管理者。是大脑&#xff0c;是最最最重要的部门之一。今日推荐岗位的核心技能分布如下&#xff1a; 简历发送方式…...

不适合编程的人是怎样的?

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

el-table表格变更前后根据数据值改变背景颜色

需求&#xff1a; 1.左侧变更前表格数据不可以编辑&#xff0c;并且背景色加灰 2.右侧变更后表格数据可被编辑&#xff0c;编辑后变更前与变更后行数据不一致&#xff0c;添加背景色区分 3.点击删除的时候&#xff0c;给变更后表格当前行&#xff0c;添加背景色和删除的中横…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...