【JAVA面试题】什么是深拷贝?什么是浅拷贝?

🍎个人博客:个人主页

🏆个人专栏:    JAVA   

⛳️ 功不唐捐,玉汝于成


目录

前言 

一、解释

1. 深拷贝(Deep Copy):

2. 浅拷贝(Shallow Copy):

结语

我的其他博客


前言 

        在Java编程中,对于对象的复制有深拷贝和浅拷贝两种不同的方式,它们涉及到如何处理对象的引用类型成员。深拷贝会创建对象及其所有引用类型成员的独立副本,而浅拷贝则只复制对象本身和其基本类型成员,而不处理引用类型成员。

        准备好迎接对对象复制的深度探索吧!通过学习深浅拷贝,你将增强对Java中内存管理和对象引用的理解,为更高效、可靠的程序编写打下坚实基础。        

一、解释

在Java中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是与对象复制相关的两个概念。它们描述了在复制对象时对对象内部成员的处理方式,特别是对于嵌套对象或引用类型成员的处理。

1. 深拷贝(Deep Copy):

深拷贝是指在复制对象时,不仅复制了对象本身,还复制了对象内部的所有引用类型成员以及它们所引用的对象,形成了一个全新的对象副本。深拷贝会递归地复制对象的所有层级,确保原对象和副本对象是完全独立的,对一个对象的修改不会影响到另一个对象。

在Java中,实现深拷贝的方式通常包括以下几种:

  • 使用clone方法: 对象实现Cloneable接口,并重写clone方法,确保在复制对象时,引用类型成员也进行了递归的复制。

    public class MyClass implements Cloneable {
        private int intValue;
        private SomeObject someObject;
    
        // Constructor and other methods...
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            MyClass cloned = (MyClass) super.clone();
            cloned.someObject = (SomeObject) someObject.clone(); // Deep copy for reference type
            return cloned;
        }
    }
    
  • 使用序列化: 将对象写入字节流,然后从字节流中读取出一个全新的对象。这种方式能够实现深拷贝,但效率相对较低。

    public class DeepCopyUtil {
        public static <T> T deepCopy(T original) {
            try {
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(bos);
                oos.writeObject(original);
                oos.flush();
                oos.close();
    
                ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
                ObjectInputStream ois = new ObjectInputStream(bis);
    
                @SuppressWarnings("unchecked")
                T copy = (T) ois.readObject();
    
                return copy;
            } catch (Exception e) {
                throw new RuntimeException("Deep copy failed", e);
            }
        }
    }
    

2. 浅拷贝(Shallow Copy):

        浅拷贝是指在复制对象时,只复制对象本身及其基本类型成员,而不复制对象内部的引用类型成员。这意味着原对象和副本对象共享相同的引用类型成员,对其中一个对象的修改可能会影响到另一个对象。

        在Java中,最常见的浅拷贝方式是使用Object类的clone方法,或者使用一些库中提供的复制工具。

public class MyClass implements Cloneable {
    private int intValue;
    private SomeObject someObject;

    // Constructor and other methods...

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone(); // Shallow copy
    }
}

需要注意的是,浅拷贝只会复制对象的直接成员,而不会递归复制引用类型的内部成员。

总体而言,深拷贝和浅拷贝在对象复制时有不同的应用场景,根据具体需求选择合适的方法。深拷贝适用于需要创建对象的完全独立副本的情况,而浅拷贝则更适用于只需要对象的一份拷贝,而不关心引用类型成员的独立性的情况。

 

 

结语

         深拷贝和浅拷贝分别适用于不同的场景,你现在具备了在实际项目中选择合适复制方式的能力。深拷贝适用于需要独立对象副本的情况,而浅拷贝则更适合处理对象的简单复制需求。

我的其他博客

探索灵活性与可维护性的利器:策略(Strategy)模式详解-CSDN博客

深入探讨敏捷开发项目管理流程与Scrum工具:构建高效团队与卓越产品的秘诀-CSDN博客

vue的生命周期-CSDN博客

什么是tomcat?tomcat是干什么用的?-CSDN博客

Linux 压缩、解压文件的 4 种方式。tar、gzip、gunzip、zip、unzip、7z命令使用方法-CSDN博客

腾讯-轻量应用服务器centos7中宝塔安装MySQL8.0出现内存不足-CSDN博客

JVM的类的生命周期-CSDN博客

多线程------Future异步任务-CSDN博客

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薅你两根毛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值