iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >JAVA几种方式实现深拷贝
  • 475
分享到

JAVA几种方式实现深拷贝

Java拷贝深拷贝浅拷贝 2023-09-05 07:09:24 475人浏览 八月长安
摘要

JAVA几种方式实现深拷贝 准备 定义两个类用于测试拷贝,类内容如下,目的是深拷贝一个User类的对象: @Data@Accessors(chain = true)public class User

JAVA几种方式实现深拷贝

准备

定义两个类用于测试拷贝,类内容如下,目的是深拷贝一个User类的对象:

@Data@Accessors(chain = true)public class User {    private Integer id;    private Integer age;    private String name;    private Car car;    private String cateGory;}
@Data@Accessors(chain = true)public class Car {    private Integer id;    private String color;    private String name;} 

实现

package com.demo;import com.fasterxml.jackson.core.JSONProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;import lombok.Data;import lombok.experimental.Accessors;import java.io.*;@Data@Accessors(chain = true)public class User implements Cloneable, Serializable {    private Integer id;    private Integer age;    private String name;    private Car car;    private String category;    @Override    public User clone() throws CloneNotSupportedException {        return (User) super.clone();    }        public User copyUser1() {        User copyUser = new User()                .setId(this.getId())                .setName(this.getName())                .setAge(this.getAge())                .setCategory(this.getCategory());        if (this.getCar() != null) {            copyUser.setCar(new Car().setId(this.getCar().getId())                    .setColor(this.getCar().getColor())                    .setName(this.getCar().getName()));        }        return copyUser;    }        public User copyUser2() throws CloneNotSupportedException {        User cloneUser = this.clone();        if(this.getCar() != null) {            cloneUser.setCar(this.getCar().clone());        }        return cloneUser;    }        public User copyUser3() throws IOException, ClassNotFoundException {        ByteArrayOutputStream bos = new ByteArrayOutputStream();        ObjectOutputStream oos = new ObjectOutputStream(bos);        oos.writeObject(this);        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());        ObjectInputStream ois = new ObjectInputStream(bis);        return (User) ois.readObject();    }        public User copyUser4() throws jsonProcessingException {        ObjectMapper objectMapper = new ObjectMapper();        return objectMapper.readValue(objectMapper.writeValueAsString(this),User.class);    }} 

验证

package com.demo;import java.io.IOException;public class CopyDemo {    public static void main(String[] args) throws IOException, CloneNotSupportedException, ClassNotFoundException {        User user = new User().setAge(10).setName("李四").setId(3).setCategory("工人");        user.setCar(new Car().setName("保时捷").setId(999).setColor("黑色"));        User copyUser1 = user.copyUser1();        System.out.println("copyUser1:" + copyUser1);        System.out.println("copyUser1与user对象是否是同一个:" + (System.identityHashCode(user) == System.identityHashCode(copyUser1)));        System.out.println("copyUser1中的car与user中的car是否是同一个:"+(System.identityHashCode(user.getCar()) == System.identityHashCode(copyUser1.getCar())));        System.out.println("====================");        User copyUser2 = user.copyUser2();        System.out.println("copyUser2:" + copyUser2);        System.out.println("copyUser2与user对象是否是同一个:" + (System.identityHashCode(user) == System.identityHashCode(copyUser2)));        System.out.println("copyUser2中的car与user中的car是否是同一个:"+(System.identityHashCode(user.getCar()) == System.identityHashCode(copyUser2.getCar())));        System.out.println("====================");        User copyUser3 = user.copyUser3();        System.out.println("copyUser3:" + copyUser3);        System.out.println("copyUser3与user对象是否是同一个:" + (System.identityHashCode(user) == System.identityHashCode(copyUser3)));        System.out.println("copyUser3中的car与user中的car是否是同一个:"+(System.identityHashCode(user.getCar()) == System.identityHashCode(copyUser3.getCar())));        System.out.println("====================");        User copyUser4 = user.copyUser4();        System.out.println("copyUser4:" + copyUser4);        System.out.println("copyUser4与user对象是否是同一个:" + (System.identityHashCode(user) == System.identityHashCode(copyUser4)));        System.out.println("copyUser4中的car与user中的car是否是同一个:"+(System.identityHashCode(user.getCar()) == System.identityHashCode(copyUser4.getCar())));    }}

验证结果

copyUser1:User(id=3, age=10, name=李四, car=Car(id=999, color=黑色, name=保时捷), category=工人)copyUser1与user对象是否是同一个:falsecopyUser1中的car与user中的car是否是同一个:false====================copyUser2:User(id=3, age=10, name=李四, car=Car(id=999, color=黑色, name=保时捷), category=工人)copyUser2与user对象是否是同一个:falsecopyUser2中的car与user中的car是否是同一个:false====================copyUser3:User(id=3, age=10, name=李四, car=Car(id=999, color=黑色, name=保时捷), category=工人)copyUser3与user对象是否是同一个:falsecopyUser3中的car与user中的car是否是同一个:false====================copyUser4:User(id=3, age=10, name=李四, car=Car(id=999, color=黑色, name=保时捷), category=工人)copyUser4与user对象是否是同一个:falsecopyUser4中的car与user中的car是否是同一个:false

结论

使用java原生推荐方法三,方法一、方法二缺点过于明显,第三方库的方式可以用方法四,Spring Boot默认的序列化反序列化就是Jackson,另外比照方法四同类的类库也能实现

来源地址:https://blog.csdn.net/qq_43842093/article/details/132137006

--结束END--

本文标题: JAVA几种方式实现深拷贝

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JAVA几种方式实现深拷贝
    JAVA几种方式实现深拷贝 准备 定义两个类用于测试拷贝,类内容如下,目的是深拷贝一个User类的对象: @Data@Accessors(chain = true)public class User ...
    99+
    2023-09-05
    Java 拷贝 深拷贝 浅拷贝
  • java中关于深拷贝的几种方式
    在java里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝。 浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化。深拷贝则是拷贝了源对象的所有值,所以即使源对象的值发生变化时,拷贝对象的值也不会改...
    99+
    2023-08-31
    java jvm 开发语言
  • JavaScript深拷贝的几种实现方法实例
    目录浅拷贝与深拷贝1.JSON.parse(JSON.stringify(obj))2.普通递归函数实现深拷贝3.兼容多种数据类型4.jQuery.extend()方法总结 ...
    99+
    2022-11-13
  • JS实现深拷贝的几种方法介绍
    引 如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。 此篇文章...
    99+
    2022-11-13
  • vue深拷贝的3种实现方式小结
    目录1、通过递归方式实现深拷贝2、JSON.parse(JSON.stringify(obj))3、jQuery的extend方法实现深拷贝拓展阅读vue深拷贝的其他实现方式总结vu...
    99+
    2023-02-21
    vue深拷贝的三种实现方式 vue实现深拷贝 vue 深拷贝
  • java深拷贝的实现方式有哪些
    在Java中,深拷贝可以通过以下几种方式来实现:1. 实现Cloneable接口并重写clone()方法:Cloneable接口标记...
    99+
    2023-08-08
    java
  • JS实现深拷贝和浅拷贝的方式详解
    目录一. 基本类型数据拷贝二. 引用类型数据拷贝1、浅拷贝2、深拷贝说道数据拷贝就离不开数据类型,在JS中数据类型分为基本类型和引用类型 基本类型: number, boolean,...
    99+
    2022-11-13
  • javascript进阶篇深拷贝实现的四种方式
    目录概念介绍第一种:递归方式(推荐,项目中最安全最常用)第二种:JSON.stringify() ;(这个不推荐使用,有坑)第三种:使用第三方库lodash中的cloneDeep()...
    99+
    2022-11-13
  • Vue浅拷贝和深拷贝实现方案
    目录前言一、数据类型1.1.基本数据类型1.2.引用数据类型1.3.区别二、浅拷贝2.1.定义2.2.浅拷贝特点三、深拷贝3.1.定义3.2.深拷贝特点四、拷贝实现方案4.1.Obj...
    99+
    2023-03-03
    vue深拷贝 vue浅拷贝和深拷贝区别 vue浅拷贝和深拷贝
  • Java的深拷贝和浅拷贝怎么实现
    这篇文章主要介绍“Java的深拷贝和浅拷贝怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java的深拷贝和浅拷贝怎么实现”文章能帮助大家解决问题。关于Java的深拷贝和浅拷贝,简单来说就是创...
    99+
    2023-06-26
  • 浅拷贝的三种实现方式
    1、ES6的方法 Object.assign()  作用:将第二个参数及以后的参数合并到第一个对象里。 参数1:target 参数2:对象…… 参数3:对象…. 例:       var obj = {a:{name:”kaiqin”,ag...
    99+
    2023-10-29
    三种 方式
  • java 文件拷贝的四种方式
    1. java 移动文件的方式有几种? 在 Java 中,可以使用多种方法来移动文件。 //使用 java.nio.file.Files 类的 move() 方法:import java.nio.fi...
    99+
    2023-09-02
    java servlet jvm
  • 怎么使用json方式实现深拷贝
    使用json方式实现深拷贝的步骤如下:1. 将要拷贝的对象转换为json格式的字符串。2. 将json字符串转换回对象。以下是一个示...
    99+
    2023-09-05
    json
  • javascript深拷贝实现的方式有哪些
    本篇内容主要讲解“javascript深拷贝实现的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“javascript深拷贝实现的方式有哪些”吧!概念介绍深拷贝:在堆内存中重新开辟一个存...
    99+
    2023-07-02
  • java实现深拷贝的方法是什么
    Java实现深拷贝的方法有以下几种:1. 实现Cloneable接口并重写clone()方法:在需要深拷贝的类中实现Cloneabl...
    99+
    2023-08-14
    java
  • Java实现InputStream的任意拷贝方式
    Java InputStream的任意拷贝 有时候,当我们需要多次使用到同一个InputStream的时候如何实现InputStream的拷贝使用 我们可以把InputStream首...
    99+
    2022-11-12
  • 详解Java数组的四种拷贝方式
    目录深拷贝与浅拷贝的区别1. for循环进行拷贝拷贝数值类型拷贝引用类型2. copyof / copyOfRange拷贝数值类型拷贝引用类型3. arraycopy拷贝数值类型拷贝...
    99+
    2022-11-13
  • C++深浅拷贝及简易string类实现方式
    目录三种拷贝方式浅拷贝深拷贝写时拷贝VS与GCC中的拷贝方式Windows VS2022Linux GCC简易string类传统版写法的string类现代版写法string类总结三种...
    99+
    2023-02-05
    C++深浅拷贝 C++实现string类 C++ string类
  • java零拷贝的实现方式有哪些
    Java 的零拷贝(Zero-copy)是指在数据传输过程中,避免将数据从一个缓冲区复制到另一个缓冲区,从而提高数据传输的效率。Ja...
    99+
    2023-09-23
    java
  • java零拷贝的实现方式是什么
    本篇内容主要讲解“java零拷贝的实现方式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java零拷贝的实现方式是什么”吧!1.什么是零拷贝零拷贝字面上的意思包括两个,“零”和“拷贝”:“...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作