当前位置: 首页 > 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,因为原数组没有被修改。


总结

  • 浅拷贝

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

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

  • 深拷贝

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

相关文章:

  • 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.二叉树的前序遍历
  • 电脑桌面便利贴,备忘录软件哪个好?
  • 乘客被地铁厕所门砸伤,南京地铁:突然坏的,已和乘客沟通处理
  • 国博馆刊|北朝至唐初夏州酋豪李氏家族的发展与身份记忆
  • 外交部回应西班牙未来外交战略:愿与之一道继续深化开放合作
  • 印巴战火LIVE|巴基斯坦多地遭印度导弹袭击,巴总理称“有权作出适当回应”
  • 专家解读《人源类器官研究伦理指引》:构建类器官研究全过程伦理治理框架
  • 景点变回监狱,特朗普下令重新启用“恶魔岛”