java 深拷贝和浅拷贝

深拷贝和浅拷贝的概念

浅拷贝:只对基本数据类型进行拷贝,针对于引用数据类型,只是拷贝了对象的引用,没有真实的创建一个新的对象就是浅拷贝

深拷贝:在对引用数据类型拷贝过程中,创建了一个新的对象,并且复制了对象内的所有成员变量,则是深拷贝

浅拷贝例子 

 创建了饮用水类,其中包括名称和生产厂家字段

package com.alibaba.fescar.core.protocol.test;

import lombok.Data;

@Data
public class Water {

    private String name;

    private String factory;

    public Water(String name, String factory) {
        this.name = name;
        this.factory = factory;
    }

    @Override
    public String toString() {
        return "Water{" +
                "name='" + name + '\'' +
                ", factory='" + factory + '\'' +
                '}';
    }
}

测试浅拷贝

package com.alibaba.fescar.core.protocol.test;

public class Test {
    public static void main(String[] args) {
        Water water = new Water("怡宝","华润");
        // 此处既是浅拷贝
        Water water1 = water;
        System.out.println(water.toString());
        System.out.println(water1.toString());
    }
}

输出结果 


如果浅拷贝对象操作属性呢,我们来试一下 

package com.alibaba.fescar.core.protocol.test;

public class Test {
    public static void main(String[] args) {
        Water water = new Water("怡宝","华润");
        // 此处既是浅拷贝
        Water water1 = water;
        // 浅拷贝对象操作属性
        water1.setName("可乐");
        water1.setFactory("可口可乐");
        System.out.println(water.toString());
        System.out.println(water1.toString());
    }
}

输出结果 


毫无疑问,源对象也会跟着改变 ,如果作为方法形参传入在操作属性呢,在来试一下

package com.alibaba.fescar.core.protocol.test;

public class Test {
    public static void main(String[] args) {
        Water water = new Water("怡宝","华润");
        // 此处既是浅拷贝
        Water water1 = water;
        Test.test(water1);
        System.out.println(water.toString());
        System.out.println(water1.toString());
    }

    public static void test(Water water){
        // 最为参数的浅拷贝对象操作属性
        water.setName("可乐");
        water.setFactory("可口可乐");
    }
}

输出结果 


结果很明显,就是浅拷贝对象指向的是源对象,对浅拷贝对象操作就是对源对象的操作,包括做为方法形参进行传递

Object类中的clone方法也是浅拷贝

深拷贝例子 

同样以引用水对象为例,深拷贝就简单多了,创建一个新的对象就可以啦

实现方式:

  • 通过序列化方式实现深拷贝,推荐实现方式
  • 实现Cloneable接口重写clone方法实现(需要重写 clone 方法实现属性对象的拷贝,每层的每个对象都进行浅拷贝=深拷贝)比较麻烦 有需要可以自己实现
package com.alibaba.fescar.core.protocol.test;

import java.util.Objects;

public class Test {
    public static void main(String[] args) {
        Water water = new Water("怡宝","华润");
        Water water1 = new Water("可乐","可口可乐");
        System.out.println(water.toString());
        System.out.println(water1.toString());
    }
}

输出结果 


序列化方式实现深拷贝 

首先Water类必须实现序列化接口Serializable 

package com.alibaba.fescar.core.protocol.test;

import lombok.Data;

import java.io.Serializable;

@Data
public class Water implements Serializable {

    private String name;

    private String factory;

    public Water(String name, String factory) {
        this.name = name;
        this.factory = factory;
    }

    @Override
    public String toString() {
        return "Water{" +
                "name='" + name + '\'' +
                ", factory='" + factory + '\'' +
                '}';
    }
}

 定义获取深拷贝工具类

package com.alibaba.fescar.core.protocol.test;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class DeepCopyUtils {

    /**
     * 获取一个对象的深拷贝对象
     * @param t
     * @param <T>
     * @return
     */
    public static <T> T getDeepCopy(T t) {
        T deep = null;
        try {
            //在内存中开辟一块缓冲区,将对象序列化成流
            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(bout);

            out.writeObject(t);
            //找到这一块缓冲区,将字节流反序列化成另一个对象
            ByteArrayInputStream bais = new ByteArrayInputStream(bout.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
            deep =(T) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return deep;
    }

    /**
     * 获取深拷贝对象list
     * @param data
     * @param <T>
     * @return
     */
    public static <T> List<T> getDeepCopyList(List<T> data){
        List<T> deepList = new ArrayList<>();
        try {
            //在内存中开辟一块缓冲区,将对象序列化成流
            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(bout);
            out.writeObject(data);

            //找到这一块缓冲区,将字节流反序列化成另一个对象
            ByteArrayInputStream bais = new ByteArrayInputStream(bout.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
            deepList =(List<T>) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return deepList;
    }
}

测试深拷贝对象 

package com.alibaba.fescar.core.protocol.test;

public class Test {
    public static void main(String[] args) {
        Water water = new Water("怡宝", "华润");
        Water water1 = DeepCopyUtils.getDeepCopy(water);
        water1.setName("可乐");
        water1.setFactory("可口可乐");
        System.out.println(water.toString());
        System.out.println(water1.toString());
    }

}

输出结果 


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Dell服务器根据GPU温度调整风扇转速

前言 dell服务器自动风扇是根据CPU温度来调速的&#xff0c;我跑AI的时候cpu温度不高但是GPU温度很高导致显卡卡死PVE虚拟机直接挂起无法运行&#xff0c;我看了下也没有基于显卡温度调速的脚本&#xff0c;于是我就自己写了一个 基于ipmi工具 乌班图等linux先安装ipmi apt …

算法金 | A - Z,115 个数据科学 机器学习 江湖黑话(全面)

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 机器学习本质上和数据科学一样都是依赖概率统计&#xff0c;今天整整那些听起来让人头大的机器学习江湖黑话 A - C A/B Testing (A/B …

电子电器架构——智能座舱设备终端

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

电路笔记 : 嘉立创EDA 导入、查找、设计管理器(快速寻找网络标签)功能+DRC错误检查和处理

导入功能 查找功能 可查找多种类型&#xff0c;如原件名称、网络标签等 设计管理器 图层查看 DRC错误 规则设置 线距问题 大多数PCB制造商能够可靠地生产5 mil间距的走线和间隙。这是一个常见的标准&#xff0c;适合大多数消费级和工业级电子产品。在5 mil以上的间距&#xff…

设计软件有哪些?照明工具篇,渲染100邀请码1a12

阴影和照明涉及到图片的真实感和氛围&#xff0c;所以熟练使用照明工具是设计师的必备能力&#xff0c;这次我们介绍一些照明工具。 1、VRaySun VRaySun是VRay渲染器中的一个功能&#xff0c;用于模拟太阳光源。它是一种方便易用的光源类型&#xff0c;能够产生逼真的日光效果…

MySQL与PostgreSQL关键对比三(索引类型)

目录 索引类型 B-tree 索引 Hash 索引 Full-text 索引 GiST 索引 GIN 索引 BRIN 索引 索引创建示例 MySQL PostgreSQL 结论 以下SQL语句的执行如果需要开发工具支持&#xff0c;可以尝试使用SQLynx或Navicat来执行。 MySQL和PostgreSQL在索引方面有许多相似之处&am…

Puppeteer实战案例:自动化抓取社交媒体上的媒体资源

在当今数字化时代&#xff0c;社交媒体已成为人们获取信息、分享生活和进行商业推广的重要平台。随着社交媒体内容的爆炸性增长&#xff0c;自动化抓取社交媒体上的媒体资源变得尤为重要。本文将介绍如何使用Puppeteer这一强大的自动化工具来实现这一目标。 1. Puppeteer简介 …

从零开始理解AdaBoost算法:设计思路与算法流程(二)【权值更新与加权表决、数学公式】

设计思路 AdaBoost算法属于Boosting算法家族中的一种&#xff0c;其基本思路是将多个弱分类器组合成一个强分类器。 “强分类器”是指一个分类准确率较高的模型“弱分类器”则是指分类准确率略高于随机猜测的简单模型。 AdaBoost的核心思想是通过 加权 的方式逐步提高分类器…

在Modelarts上微调量化Llama3,并用docker部署

本文概述 本文先使用llama-factory去微调llama3大模型&#xff0c;然后使用llama.cpp去量化模型并打包为docker部署到服务器上让qq机器人能够调用服务&#xff0c;实现qq群内问答。 效果展示 环境准备 本文使用华为云的Modelarts的notebook去进行的模型微调 ubuntu20.04&#x…

黑马es学习

es 0. 基础概念0.1 倒排索引0.2 文档、索引0.3 与mysql对比 1 基本操作1.1 mapping 索引库操作1.2 单个文档CRUD 3. DSL查询3.1 查询所有3.2 全文检索3.3 精确查询3.4 复合查询-相关性得分3.5 分页3.6 高亮3.7 总结 2. RestClientmysql与es数据同步es集群去重 黑马视频 官方使…

【李宏毅-生成式 AI】Spring 2024, HW5:LLM Fine-tuning 实验记录

文章目录 1. Task Overview2. Overall Workflow3. Dataset 介绍4. 代码介绍4.1 环境介绍4.2 下载 dataset4.3 下载并加载模型4.2 Notebook 代码1&#xff09;import 部分2&#xff09;固定 seed3&#xff09;加载 LLM4&#xff09;加载 tokenizer5&#xff09;设置解码参数6&am…

【Linux系统化学习】传输层——TCP协议

目录 预备知识 全双工协议 协议缓冲区 TCP协议 TCP协议格式 六个标志位 两个问题 确认应答机制 流量控制 超时重传机制 连接管理机制 CLOSE_WAIT状态 TIME_WAIT状态 滑动窗口 拥塞控制 延迟应答 捎带应答 粘包问题 TCP的异常情况 TCP小结 TCP/UDP协议对比…

数据结构:插入排序和希尔排序

插入排序 逆序的情况下&#xff1a; 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(1) 顺序的情况下&#xff1a; 时间复杂度&#xff1a;O(N) 空间复杂度…

【教程】怎么获取IPV6,我教你

1.png 所以IPV6诞生了 IPV6拥有超大的地址空间 IPv4 采用 32 位地址长度&#xff0c;可以为我们提供 2^32 大约 43 亿个地址&#xff0c;而 IPv6 采用 128 位地址长度&#xff0c;为我们提供了 2^128 个地址 博主的家里用的宽带是移动宽带&#xff0c;众所周知&#xff0c;…

【qt】绘图

绘图 一.画家二.绘图事件三.坐标体系四.画笔1.setColor2.setWidth3.setStyle4.setCapStyle5.setJoinStyle6.给画家配置笔 五.画刷1.setColor2.setStyle3.给画家设置刷子 六.用到的类汇总1.QRect 矩形2.QPoint 点3.QImage 图片4.QPixmap 图片5.QLine 线6.QPainterPath 路径 七.开…

关于用宽带(拨号)连接VPN无法上网,但是wifi或者热点就可以的问题

参考链接&#xff1a;https://zhuanlan.zhihu.com/p/580929250https://zhuanlan.zhihu.com/p/580929250 https://blog.csdn.net/Yaoyao2024/article/details/132245249文章浏览阅读10w次&#xff0c;点赞161次&#xff0c;收藏515次。很多同学在学习访问学校提供的资源时或者一…

selenium自动化测试入门 —— 上传文件

selenium无法识别非web的控件&#xff0c;上传文件窗口为系统自带&#xff0c;无法识别窗口元素。 上传文件有两种场景&#xff1a;input控制上传和非input控件上传。 大多数情况都是input控件上传文件&#xff0c;只有非常少数的使用自定义的非input上传文件。 一、input控…

python实践笔记(一): 模块和包

1. 写在前面 最近在重构之前的后端代码&#xff0c;借着这个机会又重新补充了关于python的一些知识&#xff0c; 学习到了一些高效编写代码的方法和心得&#xff0c;比如构建大项目来讲&#xff0c;要明确捕捉异常机制的重要性&#xff0c; 学会使用try...except..finally&…

mathematica中针对三维图中的颜色和填充透明度进行指定

颜色指定使用的命令为&#xff1a;PlotStyle 填充的透明度使用的命令为&#xff1a;FillingStyle 示例代码&#xff1a; Clear["Global*"] Plot3D[{Sin[x^2 y], Sin[x^2 - y]}, {x, -2, 2}, {y, -2, 2}, PlotStyle -> {Directive[Red, Specularity[White, 100…

车联网安全入门——CAN总线模糊测试

文章目录 车联网安全入门——CAN总线模糊测试介绍主要特点使用场景 模糊测试&#xff08;Fuzz Testing&#xff09;CAN 总线模糊测试&#xff08;CAN Packet Fuzzing&#xff09;主要步骤工具和软件主要目标 Can-Hax安装使用获得指纹模糊测试 SavvyCAN 总结参考 车联网安全入门…