java如何实现深拷贝(IT枫斗者)

news2024/10/7 16:16:54

java如何实现深拷贝

Java浅拷贝

  • 浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。

Java深拷贝

  • 深拷贝复制变量值,对于引用数据,则递归至基本类型后,再复制。深拷贝后的对象与原来的对象是完全隔离的,互不影响,对一个对象的修改并不会影响另一个对象。深拷贝相比于浅拷贝速度较慢并且花销较大。

Java浅拷贝和深拷贝的区别是什么?

  • 通俗来讲浅拷贝的复制其引用,当引用指向的值改变时也会跟着变化;而深拷贝则是与原来的对象完全隔离,互不影响。
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jx5gcOnw-1681775781812)(C:\Users\quyanliang\AppData\Roaming\Typora\typora-user-images\1681775700804.png)]

深拷贝的实现方法主要有两种:

  • (1) 通过重写clone方法来实现深拷贝(实现Cloneable接口)

  • 慎用 Object 的 clone 方法来拷贝对象。

  • 说明: 对象的 clone 方法默认是浅拷贝,若想实现深拷贝需要重写 clone 方法实现属性对象的拷贝。

  • 与通过重写clone方法实现浅拷贝的基本思路一样,只需要为对象图的每一层的每一个对象都实现Clonneable接口并重写clone方法,最后在最顶层的类的重写的clone方法中调用所有的clone方法即可实现深拷贝。简单的说就是“每一层的每个对象都进行浅拷贝=深拷贝。

  • (2)推荐: 通过对象序列化实现深拷贝(实现Serializable接口)

  • 虽然层次调用clone方法可以实现深拷贝,但是显然代码量实在太大。特别对于属性数量比较多、层次比较深的类而言,每个类都要重写clone方法太过繁琐。

  • 将对象序列化为字节序列后,默认会将该对象的整个对象图进行序列化,再通过反序列即可完美地实现深拷贝。

  • import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    public class ObSriaInOut {
    	public static void main(String[] args) throws IOException, ClassNotFoundException {
    		Persen p = in ();
    		Persen p2 = out();
    		System.out.println(p);
    		System.out.println(p2);
    	}
    	public static Persen out() throws IOException, FileNotFoundException {
    		//创建对象输出流,在使用对象输出流时必须进行对象序列化,否则会报错java.io.NotSerializableException
    		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("f:\\person.bin", false));
    		//床架你一个persn对象
    		Persen p = new Persen("张大", 22, 5000);
    		//写出对象流
    		oos.writeObject(p);
    		//关闭流
    		oos.flush();
    		oos.close();
    		return p;
    	}
    	public static Persen in () throws IOException, FileNotFoundException, ClassNotFoundException {
    		//创建对象输入流
    		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("f:\\person.bin"));
    		//读取对象流
    		Persen p = (Persen) ois.readObject();
    		ois.close();
    		System.out.println(p.toString());
    		return p;
    	}
    }
    
  • persen类

  • package com.javabase.obj.serializable;
    import java.io.Serializable;
    public class Persen implements Serializable {
    	private String name;
    	private double sal;
    	private int age;
    	public Persen() {
    		super();
    	}
    	//构造方法用于初始化成员参数
    	public Persen(String name, double sal, int age) {
    		super();
    		this.name = name;
    		this.sal = sal;
    		this.age = age;
    	}
    	@Override
    	public String toString() {
    		return this.name + "---" + this.age + "---" + this.sal;
    	}
    }
    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2016湖南湘潭邀请赛b题思路

最近训练时写的比赛,当时b题没写,事后补一下,看了下题解,想写下自己的解释 原题解:2016湖南湘潭邀请赛题解:2016年“长城信息”杯中国大学生程序设计比赛中南地区邀请赛(迟来的题解&#xff09…

Koordinator 一周年,新版本 v1.2.0 支持节点资源预留,兼容社区重调度策略

作者:佑祎、吕风 背景 Koordinator 是一个开源项目,基于阿里巴巴在容器调度领域多年累积的经验孵化诞生,可以提升容器性能,降低集群资源成本。通过混部、资源画像、调度优化等技术能力,能够提高延迟敏感的工作负载和…

第3章:select

1.最基本的select语句 select … from…select 字段1,字段2,…from 表名* 表中所有字段(列) 2.列的别名 字段1 as 别名1字段1 别名1as:alias(别名)可以省略如果别名有空格使用一对””引起来…

应用于音箱领域中的音频功放IC型号推荐

音箱音频功放ic俗称“扩音机”又叫音频功率放大器IC;是各类音响器材中不可缺少的部分,其作用主要是将音源器材输入的较微弱信号进行放大后,产生足够大的电流去推动扬声器进行声音的重放。 现如今,音频功放芯片伴随着人工交互及智…

APS中零件工序间的移动方式解析

在加工装配的成批生产类型企业里,由于零件多种多样,工艺路线、加工方法和技术装备千差万别,因而,产品有多种流转方式。一般来说,零件在各道工序间的移动方式主要有顺序移动、平行移动和平行顺序(平顺&#…

网络威胁情报:数据的力量

在一个日益互联和数字化的世界中,网络威胁已成为一项重大挑战,可能危及您组织的声誉、财务稳定性和整体运营效率。 事实上,根据 IBM 2022 年的一份报告,数据泄露的平均成本现在为 435 万美元。 鉴于网络威胁的重要性和影响日益突…

Spring《三》DI 依赖注入

🍎道阻且长,行则将至。🍓 上一篇:Spring《二》bean 的实例化与生命周期 下一篇:敬请期待 目录 一、setter 注入🍉1.注入引用数据类型2.注入简单数据类型 二、构造器注入🍊1.注入引用数据类型2.…

吴恩达团队AI诊断心律失常研究:准确率超人类医生

2019年,吴恩达团队在AI医疗领域实现了一项革命性的突破,他们成功地让AI诊断心律失常,其准确率高达83.7%,超过了人类心脏病医生的78.0%。这项研究成果已经发表在了知名期刊Nature Medicine上。 一、如何让AI学会诊断心律失常&…

Linux多媒体子系统02:V4L2核心框架分析

1 V4L2框架结构概述 1.1 imx8视频输入通路硬件结构 软件框架是对硬件结构的映射与描述,所以在说明V4L2框架结构之前先说明一下硬件结构,此处以imx8视频输入通路为例(下图中红框部分) 1. MIPI-CSI2(Camera Serial Int…

测试Ocr工具IronOCR(续:编写图片圈选程序)

上一篇文章学习了IronOCR的基本用法之后,计划做一个加载本地图片后,从图片中圈选某一位置的文字,然后调用IronOCR识别圈选区域文本的程序。本文实现从本地加载图片并完成圈选的功能。   主要的功能包括以下几点:   1&#xff…

提效降本应对无序竞争,采埃孚+东软睿驰的组合样本

降价与降本,就好似车企与供应商之间的“窗户纸”;如果是持续的无序竞争,势必一捅就破。而只有通过产业链的通力协作,才有机会维持一定的平衡。 多元化需求、车企降本、新车开发周期缩短等一系列因素,正在驱动智能化在中…

Spring Security实现JWT token验证

Spring Security实现JWT token验证 Spring Security是Spring提供的一个安全框架,提供认证和授权功能,最主要的是它提供了简单的使用方式,同时又有很高的灵活性,简单、灵活、强大 一般系统里关于角色方面通常有这么几张表&#xf…

【Dubbo核心 详解三】Dubbo服务接口的详解

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Dubbo专栏 文章目录 引言一、简介1. 介绍 Dubbo 服务接口的基本概念和特点1.1 Dubbo 服务接口的基础概念1.2 Dubbo 服务接口的特点2. 介绍 Dubbo 服务接口的…

机器学习——SVM的易错题型

问:支持向量机仅可以用于处理二分类任务 答:错误。支持向量机可以用于处理多分类任务,通过使用一对多或一对一的方法,将多个类别分别与其他类别做二分类。也可以使用多类支持向量机算法,直接将多个类别一起纳入训练和…

路侧激光雷达目标检测系统-篇1

说明:又到了毕业的季节,拿出来我之前做的小雷达识别项目,给学弟学妹们做毕设一点参考。这个主要是根据雷达采集的数据包进行聚类识别,看那些是汽车,更改数据的特征之后可以识别特定目标,比如路上新人等。  …

SpringCloud --- Nacos注册中心

一、认识和安装Nacos Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。 二、服务注册到nacos Nacos是SpringCloudAlibaba的组件,而SpringCloudAlibaba也遵循SpringCloud中定义的服务注…

Stable Diffusion公司发布首个大语言模型StableLM,已开源公测!

文 | 智商掉了一地 20号凌晨,Stability AI 发布了一个新的开源语言模型—— StableLM,该公司曾开发了 Stable Diffusion 图像生成工具。这则新闻意味着它不再局限于图像与视频生成领域,将正式加入文本生成 AI 赛道。 StableLM 模型可以生成文…

企业号运营全攻略,让你的品牌更具竞争力

实体企业抖音矩阵运营主要包含以下五个方面:多平台帐号绑定、短视频制作、短视频发布、私信评论维护以及提供数据分析报表。   一、多平台帐号绑定   多平台帐号绑定是实体企业进行抖音矩阵运营的第一步。通过将企业的各种社交账号与抖音账号进行绑定&#xff0…

CoreMark 测试指南

1、coremark 简介 coremark 是由EEMBC提出的一个评价CPU性能指标的跑分软件。其主要目标是测试处理器核心性能。CoreMark程序使用C语言写成,包含如下四类运算法则:数学矩阵操作(普通矩阵运算)、列举(寻找并排序&#…

[2019.01.25]Android NDK Crash错误定位

Android NDK开发Crash错误定位: D:\Users\Android\Sdk ndk-stack.exe: D:\Users\Android\Sdk\ndk-bundle\prebuilt\windows-x86_64\bin aarch64-linux-android-addr2line.exe: D:\Users\Android\Sdk\ndk-bundle\toolchains\ aarch64-linux-android-4.9\prebuilt\windows-x86_64…