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日

相关文章

  • Java基础之FastJson详解

    Java基础之FastJson详解 FastJson是一个Java语言编写的轻量级JSON解析工具,具有解析速度快、易用性好等优点。本文将从以下几个方面详细讲解FastJson的使用: 导入FastJson依赖 基本用法 使用注解进行自定义序列化与反序列化 高级特性 导入FastJson依赖 在使用FastJson之前,我们需要在项目中导入FastJson依…

    Java 2023年5月26日
    00
  • 10k+点赞的 SpringBoot 后台管理系统教程详解

    首先我们需要明确一下什么是SpringBoot后台管理系统。SpringBoot是一个Java开发框架,它能够帮助开发者快速搭建一个Java Web应用程序,尤其适用于后台管理系统的开发。而SpringBoot后台管理系统,就是指采用SpringBoot框架开发的一个管理后台,用于管理数据和业务逻辑。 接下来,我将详细讲解如何制作一个10k+点赞的Sprin…

    Java 2023年5月15日
    00
  • JavaScript中的数组特性介绍

    关于JavaScript中的数组特性,我们可以从以下几个方面进行介绍: 数组的创建和初始化 JavaScript中的数组可以使用字面量和构造函数两种方式进行创建和初始化。其中,字面量方式如下: const array = [‘a’, ‘b’, ‘c’]; 构造函数方式如下: const array = new Array(‘a’, ‘b’, ‘c’); 需要…

    Java 2023年5月26日
    00
  • java使用influxDB数据库的详细代码

    下面我将为您详细讲解Java使用InfluxDB数据库的详细代码。 1. InfluxDB简介 InfluxDB是一种开源的分布式时序数据库,广泛应用于监控、IoT、实时分析等领域。它具有以下特点: 高效的写入和查询 支持SQL查询语言 支持数据压缩和自动删除 支持分布式架构 2. 安装InfluxDB 在使用InfluxDB前,需要先下载并安装Influx…

    Java 2023年5月19日
    00
  • Android 中cookie的处理详解

    Android 中cookie的处理详解 什么是cookie 在讲解 Android 中cookie的处理之前,先介绍一下什么是cookie。Cookie是服务器发送到用户浏览器并保存在本地的一小块数据,浏览器在之后访问同一服务器时会在请求头中带上这些数据。通常,它用于判断用户是否已经登录网站、跟踪用户操作等。在 Android 开发中,cookie的处理是…

    Java 2023年6月16日
    00
  • 微信小程序 登陆流程详细介绍

    下面是关于”微信小程序 登陆流程详细介绍”的攻略。 微信小程序登陆流程详细介绍 1. 获取用户信息前的流程 在小程序中进行用户登陆需要分为两步走,首先是获取Code,然后再用Code换取session_key和openid: wx.login({ success: res => { // 成功获取到Code const code = res.code …

    Java 2023年5月23日
    00
  • java外卖订餐系统小项目

    下面是”Java外卖订餐系统小项目”的完整攻略。 一、项目背景 本项目为一款基于Java语言开发的外卖订餐系统,目的是通过互联网技术使用户可以在线订餐并进行支付。本项目分前台、后台两部分,前台提供用户订餐、付款等功能,后台提供商家管理、订单管理等功能。 二、项目框架 1. 前台 前台框架采用SpringBoot + Thymeleaf模板引擎,其中重要功能包…

    Java 2023年5月24日
    00
  • Java连接数据库,及增删改查的示例

    下面是“Java连接数据库,及增删改查的示例”的完整攻略。 1. 连接数据库 Java连接数据库通常需要使用JDBC API,需要先下载并安装相应的JDBC驱动。一般情况下,不同的数据库使用的JDBC驱动是不同的,我们需要选择对应的JDBC驱动。以MySQL为例,我们可以使用以下步骤来连接数据库: 1.下载MySQL官方提供的JDBC驱动,例如mysql-c…

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