【大白话说Java面试题】【Java基础篇】第40题:Java中的深拷贝和浅拷贝有什么区别

📌 专栏 :大白话说Java面试题 --- 01-Java基础篇

第40题:Java中的深拷贝和浅拷贝有什么区别

📚 回答:

  • 核心概念
    深拷贝和浅拷贝是 Java 中对象复制的两种方式,主要区别在于是否复制对象内部的引用类型成员变量。

1. 浅拷贝
  • 定义

    • 浅拷贝只复制对象本身,而不复制对象内部的引用类型成员变量。
    • 复制后的对象和原对象共享引用类型的成员变量。
  • 实现方式

    • 实现 Cloneable 接口并重写 clone() 方法。
    • 默认的 clone() 方法执行的是浅拷贝。

    💡 代码示例

    以下代码展示了浅拷贝的行为:

java 复制代码
class Address {
    String city;
    public Address(String city) {
        this.city = city;
    }
}

class Person implements Cloneable {
    String name;
    Address address;

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

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone(); // 默认浅拷贝
    }
}

public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Address address = new Address("Beijing");
        Person p1 = new Person("Alice", address);
        Person p2 = (Person) p1.clone();

        p2.address.city = "Shanghai";
        System.out.println(p1.address.city); // 输出 Shanghai
    }
}

2. 深拷贝
  • 定义

    • 深拷贝不仅复制对象本身,还递归地复制对象内部的所有引用类型成员变量。
    • 复制后的对象和原对象完全独立,互不影响。
  • 实现方式

    • clone() 方法中手动复制引用类型成员变量。
    • 或者通过序列化(Serializable)实现深拷贝。

    💡 代码示例

    以下代码展示了深拷贝的行为:

java 复制代码
class Address implements Cloneable {
    String city;
    public Address(String city) {
        this.city = city;
    }

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

class Person implements Cloneable {
    String name;
    Address address;

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

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person cloned = (Person) super.clone();
        cloned.address = (Address) address.clone(); // 深拷贝引用类型
        return cloned;
    }
}

public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Address address = new Address("Beijing");
        Person p1 = new Person("Alice", address);
        Person p2 = (Person) p1.clone();

        p2.address.city = "Shanghai";
        System.out.println(p1.address.city); // 输出 Beijing
    }
}

3. 对比总结
特性 浅拷贝 深拷贝
复制范围 只复制对象本身 复制对象及其所有引用类型成员变量
实现方式 默认 clone() 方法 手动复制引用类型或序列化
适用场景 引用类型成员变量无需独立时 引用类型成员变量需要完全独立时

💡 面试官视角

  • 面试官可能会问"如何实现深拷贝?"答:可以通过手动复制引用类型成员变量或使用序列化(Serializable)机制。
  • 面试官可能会追问"浅拷贝有哪些局限性?"答:浅拷贝可能导致多个对象共享同一引用类型的成员变量,修改一个对象会影响其他对象。
相关推荐
编程阿峰2 小时前
Python 环境配置(二)安装jupyter、matplotlib、numpy库
开发语言·python·jupyter·numpy·matplotlib
AC赳赳老秦2 小时前
CSDN 技术社区数据采集:OpenClaw 抓取公开技术热帖,生成领域技术热点周报
java·大数据·前端·数据库·python·php·openclaw
磁爆步兵2 小时前
内存分区:程序运行的核心秘密
java·开发语言·jvm
此生决int2 小时前
深入理解C++系列(06)——模版初阶与STL
开发语言·c++
用户2873555325923 小时前
OpenResty 中 Lua 脚本实战示例(分场景讲清 Lua 解决了 Nginx 原生做不到的事)
面试
流星白龙3 小时前
【Docker】4.NameSpace空间隔离实战
java·运维·docker
AI人工智能+电脑小能手3 小时前
【大白话说Java面试题 第207题】【09_Zookeeper篇】第8题:谈谈 ZooKeeper 的可靠性保障机制
java·zookeeper·高可用·可靠性·分布式系统
swany3 小时前
同步数据中,只需要几秒钟 & milvus向量数据库不可用 dify1.16.1 升级后踩坑记录
开发语言·python·numpy
harmful_sheep3 小时前
maven多版本包导致java.lang.NoClassDefFoundError
java·maven
小杍随笔3 小时前
2025年Rust GUI框架实战万字避坑指南
开发语言·后端·rust