当前位置: 首页 > news >正文

【java】深拷贝和浅拷贝的区别

1. 浅拷贝
  • 什么是浅拷贝:浅拷贝会创建一个新对象,但如果对象中有引用类型(比如数组、对象等),浅拷贝只会复制引用(地址),而不会复制引用指向的实际内容。

  • 对于基本数据类型数组

    • 基本数据类型(如 intdouble 等)是值传递的,所以浅拷贝会复制实际的值。

    • 修改拷贝数组的元素不会影响原数组。

  • 对于引用数据类型数组

    • 引用数据类型(如对象、数组等)是引用传递的,浅拷贝只会复制引用地址。

    • 修改拷贝数组的元素会影响原数组,因为它们指向同一个对象。

2. 深拷贝
  • 什么是深拷贝:深拷贝会递归复制对象中的所有内容,包括引用类型指向的实际内容。

  • 无论数组中的元素是基本数据类型还是引用数据类型,深拷贝都会创建一个完全独立的新对象。


修正后的例子

例子 1:基本数据类型数组(浅拷贝)

java

Copy

int[] original = {1, 2, 3};
int[] copy = original.clone(); // 浅拷贝
copy[0] = 100; // 修改拷贝数组的第一个元素
System.out.println(original[0]); // 输出 1(原数组不受影响)
  • 解释

    • 对于基本数据类型数组,clone() 是值拷贝,所以修改 copy 不会影响 original

    • 输出 1,因为原数组没有变化。

例子 2:引用数据类型数组(浅拷贝)

java

Copy

class Person {
    String name;

    Person(String name) {
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) {
        Person[] original = {new Person("Alice"), new Person("Bob")};
        Person[] copy = original.clone(); // 浅拷贝

        copy[0].name = "Charlie"; // 修改拷贝数组的第一个元素的属性
        System.out.println(original[0].name); // 输出 Charlie(原数组受影响)
    }
}
  • 解释

    • 对于引用数据类型数组,clone() 是引用拷贝,copy 和 original 共享相同的对象。

    • 修改 copy[0] 的属性会影响 original[0],因为它们指向同一个对象。

    • 输出 Charlie,因为原数组被修改了。

例子 3:引用数据类型数组(深拷贝)

java

Copy

class Person implements Cloneable {
    String name;

    Person(String name) {
        this.name = name;
    }

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

public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person[] original = {new Person("Alice"), new Person("Bob")};
        Person[] copy = new Person[original.length];

        // 深拷贝
        for (int i = 0; i < original.length; i++) {
            copy[i] = (Person) original[i].clone();
        }

        copy[0].name = "Charlie"; // 修改拷贝数组的第一个元素的属性
        System.out.println(original[0].name); // 输出 Alice(原数组不受影响)
    }
}
  • 解释

    • 深拷贝会递归复制对象,copy 和 original 是完全独立的。

    • 修改 copy[0] 的属性不会影响 original[0]

    • 输出 Alice,因为原数组没有被修改。


总结

  • 浅拷贝

    • 对于基本数据类型数组,是值拷贝,修改拷贝数组不会影响原数组。

    • 对于引用数据类型数组,是引用拷贝,修改拷贝数组会影响原数组。

  • 深拷贝

    • 无论是基本数据类型数组还是引用数据类型数组,都会创建一个完全独立的新对象,修改拷贝数组不会影响原数组。

http://www.dtcms.com/a/19722.html

相关文章:

  • ISO9001质量管理体系 | 设计和开发控制程序
  • LeetCode字符串相关算法题(1)【C语言版】
  • PyQt6/PySide6 线程间通信(Signal/Slot)
  • Hasleo Backup Suite v5.0.2.3 多语种便携版:全能型数据守护神器详解
  • DockerFile优化镜像体积
  • 吸烟(抽烟)检测和识别1:吸烟(抽烟)数据集说明(含下载链接)
  • Java基础知识总结(四十八)--TCP传输、TCP客户端、TCP服务端
  • 蓝桥杯---颜色分类(leetcode第75题)题解
  • 非谓语动词三驾马车
  • .NET 9.0 的 Blazor Web App 项目,Bootstrap Blazor 全局异常 <ErrorLogger> 使用备忘
  • 【计算机网络】传输层数据段格式
  • webassembly009 transformers.js 网页端侧推理 whisper-web
  • NSCoding 与归档解档
  • wordpress资讯类网站整站打包
  • AcWing——3722. 骑车路线
  • Linux:ASoC 声卡驱动框架简介
  • nginx 实战配置
  • Pinia入门
  • 【20250215】二叉树:144.二叉树的前序遍历
  • 电脑桌面便利贴,备忘录软件哪个好?
  • vue-cli-service权限不足(Linux运行vue)
  • CAS单点登录(第7版)25.通知
  • 腾讯大数据基于 StarRocks 的向量检索探索
  • Android ListPreference使用
  • Java八股文详细文档.3(基于黑马、ChatGPT、DeepSeek)
  • 大话风险-风险模型监测三道防线
  • 在 Mac ARM 架构上使用 nvm 安装 Node.js 版本 16.20.2
  • Springboot核心:统一异常处理
  • QEMU 搭建 Ubuntu x86 虚拟机
  • Stable diffusion只换衣服的方法