【Java面试】java的深拷贝和浅拷贝

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情


在Java中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是对象复制时的两种主要策略。它们的主要区别在于如何处理对象中的引用类型字段。

浅拷贝(Shallow Copy)

浅拷贝只是复制对象的引用,而不是实际的对象。如果对象包含对另一个对象的引用,那么浅拷贝将只复制该引用,而不是引用的对象。因此,原始对象和复制对象将引用相同的对象。

原理分析
  • 对于基本数据类型(byte, short, int, long, float, double, char, boolean),浅拷贝会直接复制值。
  • 对于引用数据类型(类、接口、数组等),浅拷贝会复制引用,而不是引用的对象。
代码示例
public class ShallowCopyExample {
    private int value;
    private Object ref;

    // 构造函数、getter和setter等省略

    @Override
    public ShallowCopyExample clone() {
        try {
            return (ShallowCopyExample) super.clone(); // 使用Object类的clone方法进行浅拷贝
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        ShallowCopyExample original = new ShallowCopyExample();
        original.setValue(10);
        original.setRef(new Object());

        ShallowCopyExample copied = original.clone();

        // 修改原始对象的引用对象
        original.getRef().notify(); // 假设Object类有一个notify方法(实际没有,仅为示例)

        // 复制对象也会受到影响,因为它们引用的是同一个对象
        // 这里只是一个假设的示例,因为Object类没有notify方法
    }
}

深拷贝(Deep Copy)

深拷贝会复制对象及其引用的对象,以及那些对象的引用对象,依此类推,直到没有引用为止。这意味着原始对象和复制对象是完全独立的,对其中一个的修改不会影响另一个。

原理分析
  • 对于基本数据类型,深拷贝会直接复制值。
  • 对于引用数据类型,深拷贝会递归地复制对象及其引用的所有对象。
代码示例

由于Java没有直接提供深拷贝的方法,我们通常需要手动实现或使用序列化(如果对象实现了Serializable接口)或其他库(如Apache Commons Lang的SerializationUtils)。

以下是一个使用序列化和反序列化实现深拷贝的示例:
下滑查看解决方法

import java.io.*;

public class DeepCopyExample implements Serializable {
    private int value;
    private Object ref;

    // 构造函数、getter和setter等省略

    public DeepCopyExample deepCopy() {
        try {
            // 写入对象到字节数组输出流(即序列化)
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(this);

            // 从字节数组输入流读取对象(即反序列化)
            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bis);
            return (DeepCopyExample) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        DeepCopyExample original = new DeepCopyExample();
        original.setValue(10);
        original.setRef(new Object());

        DeepCopyExample copied = original.deepCopy();

        // 修改原始对象的引用对象不会影响复制对象
        // 因为它们是完全独立的对象
    }
}

注意:使用序列化进行深拷贝时,必须确保对象及其所有引用的对象都实现了Serializable接口,并且没有使用任何不支持序列化的字段(如瞬态字段)。

Java面试题——浅拷贝深拷贝 Java面试题——深拷贝浅拷贝Java语言中,当我们需要拷贝一个Java对象的时候,常见的会有两种方式的拷贝:浅拷贝深拷贝。 一、浅拷贝 浅拷贝只是拷贝了源对象的地址,所以源对象的任何值发生变化时,拷贝对象的值也会随之发生变化。 浅拷贝代码举例: User类 package deepcopyandshallowcopy; public class User { private String username; private String password; p 阅读详情

相关推荐

[USACO2023-JAN-Bronze] T2 Air Cownditioning II 题解

[USACO2023-JAN-Bronze] T2 Air Cownditioning II题解

1632

死磕Java面试系列:深拷贝浅拷贝的实现原理

只拷贝栈内存中的数据,不拷贝堆内存中数据。既拷贝栈内存中的数据,又拷贝堆内存中的数据。

m0_73311735的博客 1049

数字摄影与摄像中的图像信号处理器(ISP):流程与经典算法详解

图像信号处理器(Image Signal Processor, ISP)是现代数字成像系统(如智能手机、数码相机、网络摄像头等)中的核心组件,扮演着将图像传感器(如CMOS或CCD)捕获的原始光电信号转换为高质量、可供观看或进一步处理的数字图像的关键角色。在数字摄影摄像的整个链路中,光线首先通过镜头(Lens)聚焦到图像传感器上,传感器将光信号转换为模拟电信号,随后经过模数转换(A/D转换)变为原始的数字图像信号。

qq_44682523的博客 3648

java深拷贝浅拷贝

无论是基本类型还是引用类型都会创建新的实例。

qq_64847107的博客 714

Java浅拷贝深拷贝

Java中组合与聚合是非常重要的两个内容,本文主要来解释与区别两者。 概念 组合: 顾名思义,就是使用多个已有的对象组合为一个功能更加复杂强大的新对象。体现的是整体与部分、拥有的关系。又因为在对象之间,各自的内部细节是不可见的,所以我们也说这种方式的代码复用是黑盒式代码复用。 聚合: ...

L_explorer的博客 864

java面试常见题:深拷贝浅拷贝

深拷贝浅拷贝的区别 浅拷贝只是拷贝了源对象的地址,所以当源对象发生改变时,拷贝的对象的值也会对应发生改变。 深拷贝则是拷贝了源对象的所有值,而不是地址,所以深拷贝对象中的值不会随着源对象中的值的改变而改变。 发生的场景 当如果要拷贝一个A对象,而A对象中又有一个B对象,那么如果对A拷贝的时候,重新拷贝出来一个A1对象并且重新分配内存地址,但是对于A中的B对象,仅仅只是把A1中拷贝出来的B1对象的引用指向原来的B对象而已,并没有把拷贝的B1对象也重新进行分配一个新的内存地址。这就是浅拷贝。 而深拷贝

weixin_46729348的博客 1270

面试官:Java深拷贝浅拷贝区别

被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。”里面的对象“会在原来的对象它的副本之间共享。简而言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象它所引用的对象一起拷贝时即发生深拷贝深拷贝相比于浅拷贝速度较慢并且花销较大。简而言之,深拷贝把要复制的对象所引用的对象都复制了一遍。...

TimeFriends 7604

面试必问:你能说说Java深拷贝浅拷贝区别吗 ?

teacherotherteacher的只是引用而已,他们都指向了一个相同的对象Teacher(“Taylor”,26)。这就叫做引用拷贝。创建对象本身的一个副本(两者的引用地址不同)。注:深拷贝浅拷贝都是对象拷贝。

Java后端架构V 129

Java深拷贝浅拷贝,互联网 面试官 如何面试

写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。扫码加微信好友进【程序员面试学习交流群】,免费领取。也欢迎各位一起在群里探讨技术。 关于Java深拷贝浅拷贝,简单来说就是创建一个已知对象一模一样的对象。可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝浅拷贝的原理,对于Java中的所谓值传递或...

ccc_ccc8的博客 1072

Java面试题】如何在面试中展现体现架构能力?什么是深拷贝浅拷贝

这个问题属于Java基础范畴,它很重要。如果不小心使用错了拷贝方法,就会导致多个线程同时操作一个对象造成数据安全问题。一般情况下这个问题是针对1~3年左右的开发人员。另外,我将所有Java面试系列制作成了完整的面试文档。它的便捷之处在于,可以通过检索的方式,找到你想要的面试题,目前已经更新180期,总计超过15W字!...

跟着Mic学架构 714

java深拷贝浅拷贝的区别_面试官:你来说说Java深拷贝浅拷贝区别?

一、拷贝的引入(1)、引用拷贝创建一个指向对象的引用变量的拷贝。Teacherteacher=newTeacher("Taylor",26);Teacherotherteacher=teacher;System.out.println(teacher);System.out.println(otherteacher);输出结果:blog.Teacher@355da254bl...

weixin_31002061的博客 372

java面试java深拷贝浅拷贝的区别

Java中,深拷贝(Deep Copy)浅拷贝(Shallow Copy)是对象复制时两种不同的策略,它们的主要区别在于复制的深度对象之间的引用关系。 ### 浅拷贝(Shallow Copy) - 浅拷贝仅仅复制对象的引用,而不是对象本身。换句话说,它创建了一个新的对象,并将原始对象的字段值复制到新对象中。但是,如果字段是引用类型(如数组、集合或其他对象),则浅拷贝会复制这些引用,而不是引用的对象。因此,原始对象及其副本将引用相同的对象。 - 在Java中,通过实现`Cloneable`接口并重

PythonAigc的博客 1535

面试——java——深拷贝浅拷贝

一、浅拷贝 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。”里面的对象“会在原来的对象它的副本之间共享。 == 浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。== 比如说,两个引用student1student2指向不同的两个对象,但是两个引用student1student2中的两个teacher引用指向的是同一个对象,所以说明是浅拷贝。 二、深拷贝 深拷贝是一个整个独立的对象拷

weixin_44475386的博客 426

Java面试题:深拷贝浅拷贝的区别是什么?

面试题:深拷贝浅拷贝的区别是什么?

qq_55162706的博客 3877

Java经典面试题:深拷贝浅拷贝,Cloneable提供的clone()方法是深拷贝还是浅拷贝

Java中,对象的拷贝可以分为深拷贝浅拷贝两种类型。Objectclone()在需要对对象进行拷贝时,需要根据具体的需求选择合适的拷贝方式。浅拷贝在某些情况下可能会带来意想不到的结果,因为对象之间的关联可能会导致意外的修改。因此,在需要保持对象独立性的情况下,深拷贝通常是更安全可靠的选择。

m0_61891910的博客 657

java面试题09深拷贝浅拷贝的区别

深拷贝浅拷贝是编程中对象复制的两种方式。浅拷贝只复制对象本身,嵌套对象仍共享引用;深拷贝则递归复制所有嵌套对象,创建完全独立的副本。浅拷贝速度快、内存占用小,但修改共享对象会影响所有副本;深拷贝实现复杂、性能较低,但副本间完全隔离。不同语言实现方式各异(如Python的copy/deepcopy,JS的扩展运算符/JSON.parse),应用时需根据是否需要对象独立性进行选择。处理复杂数据结构时需注意循环引用性能问题。

qq_39275653的博客 500

Java面试官:讲讲深拷贝浅拷贝

在clone()后,克隆后的对象开始也是指向的原来引用地址值(刚克隆完检查a1.category == a2.category 为true),但是一旦String的值发生改变(String作为不可更改的类——immutable class,在新赋值的时候,会创建了一个新的对象)就改变了克隆后对象指向的地址,让它指向了一个新的String地址,不会影响原对象的指向值,原来的String对象还是指向的它自己的的地址。当类中含有引用类型的属性时,新对象旧对象的引⽤类型属性指向的是同⼀个对象,即为浅拷贝

mf97532的博客 823

Java的Object类深拷贝浅拷贝(面试题)

两个引用student1student2指向不同的两个对象,但是两个引用student1student2中的两个teacher引用指向的是同一个对象,所以说明是浅拷贝。方法:equals() / toString() / getClass() /hashCode() / clone() / finalize()简而言之,深拷贝把要复制的对象所引用的对象都复制了一遍。"里面的对象“会在原来的对象它的副本之间。浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。创建一个指向对象的引用变量的拷贝。

豆恭梓的博客 832

面试官:可以聊聊Java浅拷贝深拷贝吗?

我是「猿码天地」,一个热爱技术、热爱编程的IT猿。技术是开源的,知识是共享的! 写作是对自己学习的总结记录,如果您对Java、分布式、微服务、中间件、Spring Boot、Spring Cloud等技术感兴趣,可以关注我的动态,我们一起学习,一起成长! 用知识改变命运,让家人过上更好的生活,互联网人一家亲! 微信搜索「猿码天地」,回复「电子书」白嫖1000本Java开发精华电子书,回复「BAT面试」获取最新国内一线大厂Java面试题!我的微信:zhangbowen125 有任何问题欢迎私聊咨

猿码天地 268

【137期】面试官:问点儿基础的,你能说说Java深拷贝浅拷贝区别吗

【137期】面试官:问点儿基础的,你能说说Java深拷贝浅拷贝区别吗

qq_41490913的博客 103

Java面试知识点(三十五)深拷贝浅拷贝

在说浅拷贝深拷贝之前,先说对象拷贝 Student stu1 = new Student(); Student stu2 = stu1; 以上的代码,改变stu1或者stu2中任意一个对象的属性,另一个对象的属性也会随之改变。 原因出在 (stu2 = stu1) 这一句。该语句的作用是将 stu1 的引用赋值给 stu2, 这样,stu1 stu2 指向内存堆中同一个对象。 那么如何复制...

程序员世杰 2788
上一篇: java.lang.StringIndexOutOfBoundsException: 字符串索引越界异常的正确解决方法,亲测有效已解决,嘿嘿嘿
下一篇: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.Per异常的正确
代码无疆
博客等级 码龄2年 4万+粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值