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

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日

相关文章

  • 详解Linux系统配置nginx的负载均衡

    下面是详解Linux系统配置nginx的负载均衡的完整攻略: 一、安装nginx 安装nginx,可使用以下命令: sudo apt-get update sudo apt-get install nginx 二、配置nginx 1.设置upstream 我们需要设置一个upstream来管理负载均衡。可以将upstream添加到nginx配置文件/etc/…

    人工智能概览 2023年5月25日
    00
  • 强烈推荐 5 款好用的REST API工具(收藏)

    强烈推荐 5 款好用的REST API工具(收藏)攻略 1. Postman Postman 是一个强大的REST API测试客户端,可允许通过GET、POST、PUT、PATCH和DELETE等HTTP请求方式与REST APIs进行交互。Postman 提供强大的支持,并为您提供测试、调试和部署API的工具。 安装 前往官网下载并按指示安装即可。 使用示…

    人工智能概览 2023年5月25日
    00
  • 深入了解Python如何操作MongoDB

    下面是深入了解Python如何操作MongoDB的完整攻略: 1. 安装pymongo 在使用Python操作MongoDB之前,需要安装pymongo这个Python驱动包。在命令行中使用以下命令进行安装: pip install pymongo 2. 连接MongoDB数据库 在使用pymongo驱动包操作MongoDB之前,需要先连接MongoDB数据…

    人工智能概论 2023年5月25日
    00
  • flask和vue前后端分离项目部署的示例代码

    下面我将为你详细讲解Flask和Vue前后端分离项目部署的攻略,分为以下几个步骤: 1. 开发前的准备工作 在开始开发前,我们需要准备好以下工具和环境: Python环境。推荐安装Python 3.6以上的版本。 Node.js环境。推荐安装8.11以上的版本。 Vue CLI。可使用npm install -g @vue/cli命令进行安装。 MySQL数…

    人工智能概论 2023年5月25日
    00
  • 给小白的 Nginx 30分钟入门指南(小结)

    下面我来简要介绍一下“给小白的 Nginx 30分钟入门指南(小结)”的完整攻略。 1. 概述 该指南主要是介绍如何使用Nginx作为一个web服务器,并针对小白用户做了详细的讲解。主要包括Nginx的安装、基本配置以及常用命令的使用等内容。 2. 安装 Nginx的安装非常简单,只需在终端中输入以下命令即可: sudo apt update sudo ap…

    人工智能概览 2023年5月25日
    00
  • pyhton中__pycache__文件夹的产生与作用详解

    Python中__pycache__文件夹的产生与作用详解 1. __pycache__目录的作用 Python3.2引入了一项新功能叫做字节码(Byte code)优化,为了加快程序的启动时间和运行速度,Python的编译器在导入模块时会将源代码编译成字节码(.pyc)并将其保存到__pycache__目录下。下次导入该模块时,解释器会优先寻找__pyca…

    人工智能概览 2023年5月25日
    00
  • Django认证系统user对象实现过程解析

    Django认证系统user对象实现过程解析 Django提供了一个强大的认证系统,方便我们进行用户认证和管理。在这个系统中,用户对象user扮演了至关重要的角色。接下来,我将详细介绍Django认证系统user对象的实现过程。 User对象 Django认证系统中的User对象是一个封装了用户认证信息的数据结构。这个对象包含了用户的基本信息,如用户名、密码…

    人工智能概览 2023年5月25日
    00
  • Ubuntu14.04 opencv2.4.8和opencv3.3.1多版本共存的实现方法

    实现Ubuntu14.04下的OpenCV 2.4.8和OpenCV 3.3.1多版本共存,可以采用以下方法: 环境要求 Ubuntu14.04 已经安装OpenCV 2.4.8 已经安装OpenCV 3.3.1(如果需要安装的话) 步骤 1.安装依赖库 sudo apt-get install build-essential cmake git libgt…

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