Java 对象深拷贝工具类的实现

概述:

Java 对象深拷贝是指将一个对象完全复制另一个对象,即所有属性和属性值都被复制,并且两个对象之间没有相互影响。在 Java 开发中经常会使用对象深拷贝,比如在进行对象传参、克隆等场合都需要进行对象深拷贝。本文将详细讲解 Java 对象深拷贝工具类的实现。

实现:

Java 中提供了两种方式实现深拷贝:Serializable 和 Cloneable,下面分别进行介绍。

  1. Serializable 方式实现深拷贝

Serializable 序列化方式实现深拷贝,需要实现 Serializable 接口,并在对象的 writeObject 和 readObject 方法中进行序列化和反序列化。示例如下:

import java.io.*;

public class DeepCopyUtil {

    public static <T> T deepCopy(T t) throws Exception {
        ByteArrayOutputStream bo = new ByteArrayOutputStream();
        ObjectOutputStream oo = new ObjectOutputStream(bo);
        oo.writeObject(t);

        ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
        ObjectInputStream oi = new ObjectInputStream(bi);
        return (T) oi.readObject();
    }

    static class Person implements Serializable {
        private String name;
        private int age;
        private Address address;

        public Person(String name, int age, Address address) {
            this.name = name;
            this.age = age;
            this.address = address;
        }
    }

    static class Address implements Serializable {
        private String city;
        private String street;
    }

    public static void main(String[] args) throws Exception {
        Address address = new Address();
        address.city = "Beijing";
        address.street = "Chang'an Street";
        Person originPerson = new Person("Tom", 20, address);
        Person copyPerson = deepCopy(originPerson);
        System.out.println(copyPerson == originPerson);
        System.out.println(copyPerson.address == originPerson.address);
    }
}

输出结果:

false
false

从输出结果可以看出,通过 Serializable 方式实现深拷贝,对象被完全复制,两个对象没有相互影响,即使是对象中的属性也被完全复制。

  1. Cloneable 方式实现深拷贝

Cloneable 克隆方式实现深拷贝,需要将对象实现 Cloneable 接口,并在对象的 clone 方法中进行克隆。示例如下:

public class DeepCopyUtil {

    public static <T extends Cloneable> T deepCopy(T t) throws Exception {
        Method method = t.getClass().getDeclaredMethod("clone");

        @SuppressWarnings("unchecked")
        T copy = (T) method.invoke(t);
        return copy;
    }

    static class Person implements Cloneable {
        private String name;
        private int age;
        private Address address;

        public Person(String name, int age, Address address) {
            this.name = name;
            this.age = age;
            this.address = address;
        }

        public Person clone() throws CloneNotSupportedException {
            Person person = (Person) super.clone();
            person.address = address.clone();
            return person;
        }
    }

    static class Address implements Cloneable {
        private String city;
        private String street;

        public Address(String city, String street) {
            this.city = city;
            this.street = street;
        }

        public Address clone() throws CloneNotSupportedException {
            return (Address) super.clone();
        }
    }

    public static void main(String[] args) throws Exception {
        Address address = new Address("Beijing", "Chang'an Street");
        Person originPerson = new Person("Tom", 20, address);
        Person copyPerson = deepCopy(originPerson);
        System.out.println(copyPerson == originPerson);
        System.out.println(copyPerson.address == originPerson.address);
    }
}

输出结果:

false
false

从输出结果可以看出,通过 Cloneable 方式实现的深拷贝,对象也被完全复制,两个对象没有相互影响。

总结:

Java 对象深拷贝工具类的实现有多种方式可供选择,本文给出了两种方式,即 Serializable 和 Cloneable 方式。其中 Serializable 方式更加通用,但效率较低,而 Cloneable 方式效率较高,但需要实现 clone 方法,这对于一些已有类可能是不可行的。因此,在实际开发中,开发者需根据实际情况选择最合适的方式进行实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 对象深拷贝工具类的实现 - Python技术站

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

相关文章

  • windows环境下java开发工具maven的安装教程图解

    Windows环境下Java开发工具Maven的安装教程图解 Maven是一款开源的项目管理工具,主要用于Java项目的构建、依赖管理和项目信息化管理。本文将详细介绍在Windows环境下安装Maven的步骤及图解。 准备工作 在安装Maven之前,需要确保以下环境已经准备好: Java运行环境已经安装并配置好环境变量 网络连接正常,可以访问Maven的官方…

    Java 2023年5月19日
    00
  • 小程序实现带年月选取效果的日历

    下面是关于小程序实现带年月选取效果的日历的完整攻略: 一、实现思路 获取当前日期的年和月以及当月的天数; 使用数据渲染模板,并在相应的日期上添加样式; 实现滑动切换月份功能; 添加点击事件,实现从日历中选择日期并将该日期传递给父组件。 二、具体实现 下面我们将通过两个示例来说明具体实现步骤。 示例一 首先,我们需要在 wxml 文件中编写日历的结构,并通过 …

    Java 2023年5月23日
    00
  • MyBatis一次执行多条SQL语句的操作

    MyBatis是一款优秀的持久化框架,通过映射文件将SQL语句和Java方法进行映射,使得Java应用程序可以方便地访问数据库,提高数据库操作的效率和安全性。在实际应用中,有时需要执行多条SQL语句的操作,本文将详细讲解MyBatis一次执行多条SQL语句的操作的完整攻略。 1. 如何执行多条SQL语句的操作 在MyBatis中,通过使用<script…

    Java 2023年5月26日
    00
  • java 文件上传(单文件与多文件)

    好的。对于Java文件上传,常见的方式有单文件上传和多文件上传两种。 一、单文件上传 1.前端通过表单实现文件选择和提交操作,后端利用Apache的FileUpload组件进行接收处理。 <form action="upload" enctype="multipart/form-data" method=&quo…

    Java 2023年5月20日
    00
  • org.apache.ibatis.binding.BindingException异常报错原因以及详细解决方案

    先给一下org.apache.ibatis.binding.BindingException异常的概述: BindingException是MyBatis中的绑定异常,当Mapper接口和Mapper映射文件出现错误时抛出。在MyBatis中,Mapper接口和Mapper映射文件是对应绑定的,如果Mapper接口方法的参数、返回值类型或SQL语句等配置错误…

    Java 2023年5月27日
    00
  • spring kafka @KafkaListener详解与使用过程

    Spring Kafka @KafkaListener详解与使用过程 简介 Spring Kafka 为 Kafka 提供了 Producer 和 Consumer 的封装,提供了方便的API让我们在Spring Boot项目中使用Kafka。其中 @KafkaListener 的注解为我们编写 Kafka Consumer 提供便利。 使用步骤 使用 Sp…

    Java 2023年6月2日
    00
  • java中Pulsar InterruptedException 异常

    Java中Pulsar InterruptedException 异常 当使用Pulsar客户端在Java中进行操作时,可能会遇到InterruptedException异常。在本文中,我们将对该异常进行详细的讲解,包括该异常的原因、如何处理以及代码示例。 什么是InterruptedException异常 InterruptedException是Java…

    Java 2023年5月27日
    00
  • java编写简单的ATM存取系统

    下面是Java编写简单的ATM存取系统的完整攻略。 1. 确定需求分析 在开始编写ATM系统之前,我们需要对系统的需求进行分析和确认。该系统的主要功能包括: 可以登录和注册账户 可以查询账户余额 可以取款和存款 可以修改账户密码 可以退出系统 2. 设计系统架构 确定了需求之后,我们需要设计ATM系统的整体架构。整个系统需要有以下几个模块: 用户登录和注册模…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部