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

yizhihongxing

Java中关于深拷贝的几种方式总结

什么是深拷贝

在Java中,当我们复制一个对象时,有两种不同的方式,即浅拷贝和深拷贝。浅拷贝仅复制对象的引用,而深拷贝是将整个对象及其内部所有的引用类型都复制一份,不会影响原对象。在某些情景下,我们可能需要使用深拷贝来保证数据的完整性和正确性。

Java中深拷贝的几种方式

1.使用ObjectInputStream/ObjectOutputStream实现深拷贝

使用ObjectInputStreamObjectOutputStream类可以方便地实现深拷贝,只需要将要复制的对象先输出到一个字节流中,然后再从字节流中读取出来即可。代码示例:

import java.io.*;

public class DeepCopyWithSerialization {
    public static void main(String[] args) throws Exception {
        //原始对象
        TestObj obj1 = new TestObj();
        obj1.setName("张三");

        //输出流
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        //写入字节数组流
        oos.writeObject(obj1);

        //输入流
        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bais);
        //读取字节数组流
        TestObj obj2 = (TestObj) ois.readObject();

        //判断两个对象是否相同
        System.out.println(obj1 == obj2); //false
        System.out.println(obj1.getName().equals(obj2.getName())); //true
    }
}

class TestObj implements Serializable {
    private static final long serialVersionUID = 1L; //版本号
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

2.使用clone方法实现深拷贝

Java中的clone()方法支持对象的复制,但默认仅实现了浅拷贝。如果要实现深拷贝,需要将对象实现Cloneable接口,并重写clone()方法。在clone()方法内部,将对象及其内部所有属性全部复制一份即可。代码示例:

public class DeepCopyWithClone {
    public static void main(String[] args) throws CloneNotSupportedException {
        //原始对象
        TestPerson p1 = new TestPerson("张三", new TestBook("Java从入门到精通"));

        //复制对象
        TestPerson p2 = (TestPerson) p1.clone();

        //判断两个对象是否相同
        System.out.println(p1 == p2); //false
        System.out.println(p1.getBook() == p2.getBook()); //false,说明成功进行了深拷贝
    }
}

class TestPerson implements Cloneable {
    private String name;
    private TestBook book;

    public TestPerson(String name, TestBook book) {
        this.name = name;
        this.book = book;
    }

    public TestBook getBook() {
        return book;
    }

    public void setBook(TestBook book) {
        this.book = book;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        TestPerson person = (TestPerson) super.clone(); //浅拷贝
        person.book = (TestBook) book.clone(); //深拷贝
        return person;
    }
}

class TestBook implements Cloneable {
    private String name;

    public TestBook(String name) {
        this.name = name;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone(); //默认浅拷贝即可
    }
}

总结

在Java中实现深拷贝的方式有多种,每种方式都有其优缺点,适用于不同的场景。需要根据具体情况选择合适的方式来保证数据的完整性和正确性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java中关于深拷贝的几种方式总结 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • C++ xxx_cast实现转换代码实例解析

    C++ xxx_cast实现转换代码实例解析 简介 在C++编程中,类型转换是经常用到的操作之一,其中有几种不同类型的转换方式:static_cast、dynamic_cast、reinterpret_cast、const_cast等。这些转换方式都是以_cast结尾的形式呈现。其中,static_cast和dynamic_cast用得比较常见,因此本篇文章…

    人工智能概览 2023年5月25日
    00
  • 手把手教你jupyter notebook更换环境的方法

    以下是“手把手教你Jupyter Notebook更换环境的方法”的完整攻略。 写在前面 在开始更换Jupyter Notebook环境之前,我们需要认识到以下两个概念: 核(Kernel):Jupyter Notebook中的一个运行环境,它是一个与代码交互的程序实例,能够让我们在Notebook中编写、运行和编辑代码。 环境(Environment):一…

    人工智能概览 2023年5月25日
    00
  • PHP下 Mongodb 连接远程数据库的实例代码

    下面是详细讲解“PHP下 Mongodb 连接远程数据库的实例代码”的完整攻略。 确认环境 在开始编写代码之前,我们需要确认以下环境是否已经准备好了: PHP >= 5.4.0 mongodb 扩展 如果你的环境没有准备好以上要求,可以参考以下步骤进行安装: 安装 PHP 以 Ubuntu 16.04 为例,我们可以使用以下命令安装 PHP: sudo…

    人工智能概论 2023年5月25日
    00
  • python3.3教程之模拟百度登陆代码分享

    以下是关于”python3.3教程之模拟百度登陆代码分享”的完整攻略: 一、背景说明 在进行爬虫开发时,我们通常需要使用到模拟登录的技术。百度作为全球知名度最高的搜索引擎之一,其登录界面也是爬虫开发者们经常模拟登录的一个目标。接下来,我们将分享一篇”python3.3教程之模拟百度登陆代码分享”,帮助大家更好地理解模拟登录的技术。 二、模拟百度登录 1. 导…

    人工智能概论 2023年5月25日
    00
  • OpenCV2学习笔记之视频流读取与处理

    OpenCV2学习笔记之视频流读取与处理 OpenCV是一种跨平台计算机视觉库,可用于开发实时计算机视觉应用程序。本文将介绍如何使用OpenCV2读取和处理视频流。 1. 安装和配置OpenCV2 首先,你需要安装OpenCV2。可以通过包管理器(如apt-get,yum等)进行安装,也可以从OpenCV官方网站进行手动安装。为了使用OpenCV在Pytho…

    人工智能概论 2023年5月24日
    00
  • pytorch加载预训练模型与自己模型不匹配的解决方案

    加载预训练模型是深度学习中常用的技巧之一,可以利用预训练模型的权重来加快模型的训练速度,同时也提高了模型的精度。然而,有时候我们可能需要在一个不同的任务中使用一个预训练的模型,而这个预训练模型可能与我们自己定义的模型结构不匹配的情况,这时我们就需要一些解决方案。下面我将介绍几种PyTorch加载预训练模型与自己模型不匹配的解决方案。 方案一:从预训练模型中提…

    人工智能概论 2023年5月25日
    00
  • Docker如何部署Python项目的实现详解

    下面我将为你详细讲解“Docker如何部署Python项目的实现详解”。 Docker部署Python项目 1. 什么是Docker? Docker是一种开源软件平台,可以帮助开发者将应用程序与其依赖项打包到一个可移植的容器中,然后发布到任何支持Docker的机器上。 2. Docker如何部署Python项目? Docker部署Python项目的实现方法如…

    人工智能概览 2023年5月25日
    00
  • Django migrations 默认目录修改的方法教程

    下面是详细讲解“Django migrations 默认目录修改的方法教程”的完整攻略。 1. 背景 在Django项目中,我们经常会使用migrations来追踪数据库模型的修改,从而进行数据库结构的升级和迁移。而默认情况下,每个app的migrations都会存放在app目录下的migrations子目录中,但是有时候我们希望把所有的migrations…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部