首页 > 其他分享 >深拷贝和浅拷贝是什么,有什么区别?

深拷贝和浅拷贝是什么,有什么区别?

时间:2023-03-23 13:35:42浏览次数:30  
标签:name 区别 对象 age public Person 拷贝 什么

深拷贝和浅拷贝是关于对象拷贝的概念,用于描述在复制一个对象时,复制的是对象本身还是对象的引用,从而影响到新旧对象之间的关系。

浅拷贝是指将一个对象复制一份,但是新旧对象共享同一个引用,也就是说新对象和旧对象指向同一块内存地址,对新对象的修改会影响到旧对象。而深拷贝是指将一个对象复制一份,并且新对象和旧对象是完全独立的,互不干扰,对新对象的修改不会影响到旧对象。

在Java中,实现浅拷贝可以通过Object类的clone()方法实现,因为Object类中的clone()方法是浅拷贝的,但是需要实现Cloneable接口才能使用。而实现深拷贝需要自己编写代码,可以使用序列化和反序列化来实现深拷贝。

下面是Java代码实现深拷贝的示例:

javaCopy code
import java.io.*;

class Person implements Serializable {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    // 实现深拷贝
    public Person deepCopy() 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 (Person) ois.readObject();
    }
}

public class DeepCopyExample {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Person p1 = new Person("Tom", 20);
        Person p2 = p1.deepCopy();

        System.out.println(p1 == p2); // false
        System.out.println(p1.getName() == p2.getName()); // false
    }
}

在上面的示例中,我们使用了Java的序列化和反序列化来实现深拷贝。首先将对象写入一个字节数组输出流中,然后将字节数组输出流中的字节数组读取到一个字节数组输入流中,最后使用对象输入流读取字节数组输入流中的字节序列并返回新的对象。由于对象序列化和反序列化过程中会创建新的对象,因此返回的新对象是深拷贝的结果。

要使用Java实现浅拷贝,可以使用Java提供的clone()方法来复制一个对象。该方法会创建一个新对象,其中包含原始对象的所有字段和属性,但是它们的值只是复制了引用,而不是创建新的对象。

下面是一个示例代码,展示了如何使用Java的clone()方法来实现浅拷贝:

javaCopy code
class Person implements Cloneable {
    public String name;
    public int age;
    public List<String> hobbies;

    public Person(String name, int age, List<String> hobbies) {
        this.name = name;
        this.age = age;
        this.hobbies = hobbies;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

// 使用示例
Person person1 = new Person("Tom", 20, Arrays.asList("reading", "swimming"));
Person person2 = (Person) person1.clone();

// person1和person2是两个不同的对象,但是它们的属性值相同
System.out.println(person1.name.equals(person2.name)); // true
System.out.println(person1.age == person2.age); // true
System.out.println(person1.hobbies == person2.hobbies); // true,浅拷贝只是复制了引用

需要注意的是,要实现clone()方法,必须实现Cloneable接口。此外,Java中的浅拷贝只能复制对象的基本数据类型和引用类型,而不能复制对象的内部对象。如果需要实现深拷贝,则需要自己编写代码来复制对象的所有属性,包括内部对象。

标签:name,区别,对象,age,public,Person,拷贝,什么
From: https://www.cnblogs.com/crazyfish/p/17247105.html

相关文章

  • CDN加速和OSS传输加速的区别
    本文主要介绍剑盾云对象存储OSS的传输加速功能和CDN加速OSS资源的区别,以便您根据实际业务进行选择。详细信息剑盾云对象存储OSS以海量、安全、低成本、高可靠等特点已经成......
  • stlren和sizeof()区别
    strlen函数和sizeof运算符都可以用来计算字符串的长度,但它们的作用不同。strlen函数的作用是计算字符串的长度,不包括字符串末尾的空字符。例如,如果有一个字符串"hello",那么......
  • 使用TK加速器运营TikTok的内容是什么?有哪些注意事项?
    作为一个TikTok内容创作者,使用TK加速器可以提高视频上传、编辑、发布和观看的速度,提高视频质量和流畅度,从而增加用户体验和吸引更多的粉丝。 以下是一些使用TK加速器运......
  • 产品经理笔记5——什么是CRM
    究竟什么是CRM?客户关系管理(CustomerRelationshipManagement,简称CRM),是指企业为提高核心竞争力,利用相应的信息技术以及互联网技术协调企业与顾客间在销售、营销和服务上......
  • 产品经理笔记4——什么是SaaS
    SaaS即Software-as-a-service(软件即服务)的缩写,指提供商为企业搭建信息化所需要的所有网络基础设施网络基础设施及软件、硬件运作平台,并负责所有前期的实施、后期的维护等......
  • javascript中的var,let,const区别
    const:这个最简单,只需记住是声明的常量,定义的时候必须声明const的具体值,且之后不允许改变const的值 var和let区别1、由于js引擎存在预解析,会把var变量名进行提升对于......
  • 产品经理笔记3——什么是解耦
    在理解解耦之前,我们先来理解耦合度。耦合度是软件工程领域的概念,是指模块之间的依赖程度。这里的模块可以小到一个小功能,也可以大到一个系统。那么对应的,解耦就是解除模......
  • 云原生计算基金会(CNCF)毕业的10大开源项目,都是什么来头?
    云原生计算基金会(CNCF)毕业的10大开源项目,都是什么来头?零声Github整理库后台服务器架构技术分享资源Q群:202432010​关注他 14人赞同了该文章云原......
  • 免费空间主机是什么?怎么申请免费空间主机
    随着网络的普及,越来越多的人开始使用免费空间。这种新的商业模式也让一些商家得以获利。1:免费空间的概念免费空间是指允许您自由使用的网络服务。这意味着它可以被任何人用......
  • 策略模式与模版模式的区别与应用
    本文为博主原创,未经允许不得转载:最近在做项目的优化,由于项目在早期缺乏规划,在开发过程中,对于某一个业务的不同类型判断,增加了很多if else,代码的健壮性变得很差。所以......