返回顶部
首页 > 资讯 > 后端开发 > JAVA >java中关于深拷贝的几种方式
  • 325
分享到

java中关于深拷贝的几种方式

javajvm开发语言 2023-08-31 05:08:58 325人浏览 独家记忆
摘要

在java里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝。 浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化。深拷贝则是拷贝了源对象的所有值,所以即使源对象的值发生变化时,拷贝对象的值也不会改

在java里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝。

  • 浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化。
  • 深拷贝则是拷贝了源对象的所有值,所以即使源对象的值发生变化时,拷贝对象的值也不会改变。

方式1:构造函数深拷贝

package com.lyj.demo.pojo.cloneTest;import lombok.Getter;@Getterpublic class UserConstruct {    private String userName;    private AddressConstruct address;    public UserConstruct() {    }    public UserConstruct(String userName, AddressConstruct address) {        this.userName = userName;        this.address = address;    }    public static void main(String[] args) {        AddressConstruct address = new AddressConstruct("小区1", "小区2");        UserConstruct user = new UserConstruct("小李", address);        // 调用构造函数进行深拷贝        UserConstruct copyUser = new UserConstruct(user.getUserName(), new AddressConstruct(address.getAddress1(), address.getAddress2()));        // 修改源对象的值        user.getAddress().setAddress1("小区3");        // false        System.out.println(user == copyUser);        // false        System.out.println(user.getAddress().getAddress1() == copyUser.getAddress().getAddress1());        // false        System.out.println(user.getAddress().getAddress1().equals(copyUser.getAddress().getAddress1()));        // true        System.out.println(user.getAddress().getAddress2().equals(copyUser.getAddress().getAddress2()));    }}package com.lyj.demo.pojo.cloneTest;import lombok.Getter;import lombok.Setter;@Getter@Setterpublic class AddressConstruct {    private String address1;    private String address2;    public AddressConstruct() {    }    public AddressConstruct(String address1, String address2) {        this.address1 = address1;        this.address2 = address2;    }}

方式2:重载Clone()方法深拷贝

Object父类有个clone()的拷贝方法,不过它是protected类型的 ,我们需要重写它并修改为public类型,除此之外,子类还需要实现Cloneable接口来告诉JVM这个类上是可以拷贝的。

package com.lyj.demo.pojo.cloneTest;import lombok.Getter;import lombok.Setter;@Setter@Getterpublic class AddressClone implements Cloneable{    private String address1;    private String address2;    public AddressClone() {    }    public AddressClone(String address1, String address2) {        this.address1 = address1;        this.address2 = address2;    }    @Override    protected AddressClone clone() throws CloneNotSupportedException {        return (AddressClone) super.clone();    }}package com.lyj.demo.pojo.cloneTest;import lombok.Getter;import lombok.Setter;@Setter@Getterpublic class UserClone implements Cloneable{    private String userName;    private AddressClone address;    public UserClone() {    }    public UserClone(String userName, AddressClone address) {        this.userName = userName;        this.address = address;    }        @Override    protected UserClone clone() throws CloneNotSupportedException {        // 需要注意的是,super.clone()其实是浅拷贝,        // 所以在重写UserClone类的clone()方法时,address对象需要调用address.clone()重新赋值        UserClone userClone = (UserClone) super.clone();        userClone.setAddress(this.address.clone());        return userClone;    }    public static void main(String[] args) throws CloneNotSupportedException {        AddressClone address = new AddressClone("小区1", "小区2");        UserClone user = new UserClone("小李", address);        UserClone copyUser = user.clone();        user.getAddress().setAddress1("小区3");        // false        System.out.println(user == copyUser);        // false        System.out.println(user.getAddress().getAddress1().equals(copyUser.getAddress().getAddress1()));    }}

需要注意的是,super.clone()其实是浅拷贝,所以在重写User类的clone()方法时,address对象需要调用address.clone()重新赋值。

方式3:Apache Commons Lang序列化方式深拷贝

Java提供了序列化的能力,我们可以先将源对象进行序列化,再反序列化生成拷贝对象。但是,使用序列化的前提是拷贝的类(包括其成员变量)需要实现Serializable接口。

Apache Commons Lang包对Java序列化进行了封装,我们可以直接使用它。

package com.lyj.demo.pojo.cloneTest;import lombok.Getter;import lombok.Setter;import java.io.Serializable;@Getter@Setterpublic class AddressSerializable implements Serializable {    private String address1;    private String address2;    public AddressSerializable() {    }    public AddressSerializable(String address1, String address2) {        this.address1 = address1;        this.address2 = address2;    }}package com.lyj.demo.pojo.cloneTest;import lombok.Getter;import lombok.Setter;import org.apache.commons.lang3.SerializationUtils;import java.io.Serializable;@Getter@Setterpublic class UserSerializable implements Serializable {    private String userName;    private AddressSerializable address;    public UserSerializable() {    }    public UserSerializable(String userName, AddressSerializable address) {        this.userName = userName;        this.address = address;    }    public static void main(String[] args) {        AddressSerializable address = new AddressSerializable("小区1", "小区2");        UserSerializable user = new UserSerializable("小李", address);        UserSerializable copyUser = SerializationUtils.clone(user);        user.getAddress().setAddress1("小区3");        // false        System.out.println(user == copyUser);        // false        System.out.println(user.getAddress().getAddress1().equals(copyUser.getAddress().getAddress1()));    }}

来源地址:https://blog.csdn.net/wsb8233696/article/details/130907780

--结束END--

本文标题: java中关于深拷贝的几种方式

本文链接: https://lsjlt.com/news/383931.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java中关于深拷贝的几种方式
    在java里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝。 浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化。深拷贝则是拷贝了源对象的所有值,所以即使源对象的值发生变化时,拷贝对象的值也不会改...
    99+
    2023-08-31
    java jvm 开发语言
  • JAVA几种方式实现深拷贝
    JAVA几种方式实现深拷贝 准备 定义两个类用于测试拷贝,类内容如下,目的是深拷贝一个User类的对象: @Data@Accessors(chain = true)public class User ...
    99+
    2023-09-05
    Java 拷贝 深拷贝 浅拷贝
  • java中的浅拷贝与深拷贝
    1、什么叫Java浅拷贝?浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。2、什么叫Java深拷贝?深拷贝复制变量值,对于引用数据,则递归至基本类型后,再复制。深...
    99+
    2021-10-17
    java教程 java 浅拷贝 深拷贝
  • JavaScript深拷贝的几种实现方法实例
    目录浅拷贝与深拷贝1.JSON.parse(JSON.stringify(obj))2.普通递归函数实现深拷贝3.兼容多种数据类型4.jQuery.extend()方法总结 ...
    99+
    2024-04-02
  • JS实现深拷贝的几种方法介绍
    引 如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。 此篇文章...
    99+
    2024-04-02
  • javascript深拷贝的几种情况总结
    在前端项目的数据处理中,json数据的拷贝是很常见的,怎么使拷贝的双方数据之间互不影响,这就要用到深拷贝了 深拷贝:引用数据类型中名存在栈内存中,值存在于堆内存中,但是栈内存会提供一...
    99+
    2024-04-02
  • java 文件拷贝的四种方式
    1. java 移动文件的方式有几种? 在 Java 中,可以使用多种方法来移动文件。 //使用 java.nio.file.Files 类的 move() 方法:import java.nio.fi...
    99+
    2023-09-02
    java servlet jvm
  • vue深拷贝的3种实现方式小结
    目录1、通过递归方式实现深拷贝2、JSON.parse(JSON.stringify(obj))3、jQuery的extend方法实现深拷贝拓展阅读vue深拷贝的其他实现方式总结vu...
    99+
    2023-02-21
    vue深拷贝的三种实现方式 vue实现深拷贝 vue 深拷贝
  • Java中的集合及深拷贝与浅拷贝
    Java中的集合及深拷贝与浅拷贝 Java是一种面向对象的编程语言,其中集合是常用的数据结构之一,具有方便快捷的特点。在Java开发中,我们常常需要对集合进行复制(拷贝)操作。但是,拷贝操作并不是简单...
    99+
    2023-09-16
    java
  • Java Cloneable接口的深拷贝与浅拷贝方法
    本篇内容主要讲解“Java Cloneable接口的深拷贝与浅拷贝方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Cloneable接口的深拷贝与浅拷贝方法”吧!...
    99+
    2023-06-29
  • Java中深拷贝,浅拷贝与引用拷贝的区别详解
    目录引用拷贝浅拷贝深拷贝小结引用拷贝 引用拷贝: 引用拷贝不会在堆上创建一个新的对象,只 会在栈上生成一个新的引用地址,最终指向依然是堆上的同一个对象。 //实体类 public c...
    99+
    2024-04-02
  • java深拷贝的实现方式有哪些
    在Java中,深拷贝可以通过以下几种方式来实现:1. 实现Cloneable接口并重写clone()方法:Cloneable接口标记...
    99+
    2023-08-08
    java
  • JS实现深拷贝和浅拷贝的方式详解
    目录一. 基本类型数据拷贝二. 引用类型数据拷贝1、浅拷贝2、深拷贝说道数据拷贝就离不开数据类型,在JS中数据类型分为基本类型和引用类型 基本类型: number, boolean,...
    99+
    2024-04-02
  • javascript进阶篇深拷贝实现的四种方式
    目录概念介绍第一种:递归方式(推荐,项目中最安全最常用)第二种:JSON.stringify() ;(这个不推荐使用,有坑)第三种:使用第三方库lodash中的cloneDeep()...
    99+
    2024-04-02
  • 详解Java数组的四种拷贝方式
    目录深拷贝与浅拷贝的区别1. for循环进行拷贝拷贝数值类型拷贝引用类型2. copyof / copyOfRange拷贝数值类型拷贝引用类型3. arraycopy拷贝数值类型拷贝...
    99+
    2024-04-02
  • Java中的深拷贝和浅拷贝是什么意思
    这篇文章主要讲解了“Java中的深拷贝和浅拷贝是什么意思”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的深拷贝和浅拷贝是什么意思”吧! 一、前言拷贝这个词想必大家都很熟悉...
    99+
    2023-06-15
  • Java中关于 null 的几种处理方式详解
    对于 Java 程序员来说,空指针⼀直是恼⼈的问题,我们在开发中经常会受到 NullPointerException 的异常。Java 的发明者也承认这是...
    99+
    2024-04-02
  • 浅拷贝的三种实现方式
    1、ES6的方法 Object.assign()  作用:将第二个参数及以后的参数合并到第一个对象里。 参数1:target 参数2:对象…… 参数3:对象…. 例:       var obj = {a:{name:”kaiqin”,ag...
    99+
    2023-10-29
    三种 方式
  • javascript深拷贝实现的方式有哪些
    本篇内容主要讲解“javascript深拷贝实现的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“javascript深拷贝实现的方式有哪些”吧!概念介绍深拷贝:在堆内存中重新开辟一个存...
    99+
    2023-07-02
  • 探讨Java中的深浅拷贝问题
    目录一、前言二、浅拷贝三、深拷贝一、前言 拷贝这个词想必大家都很熟悉,在工作中经常需要拷贝一份文件作为副本。拷贝的好处也很明显,相较于新建来说,可以节省很大的工作量。在Java中,同...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作