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

发布于:2025-02-16 ⋅ 阅读:(154) ⋅ 点赞:(0)
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,因为原数组没有被修改。


总结

  • 浅拷贝

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

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

  • 深拷贝

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


网站公告

今日签到

点亮在社区的每一天
去签到