Java中深拷贝和浅拷贝的区别 分析复制差异

11 天前 分类: 资讯分享 3 0 0
ai区别apachejava深拷贝浅拷贝字符串常量

深拷贝与浅拷贝的关键区别在于是否复制对象内部的引用对象。1. 浅拷贝仅复制对象的非引用类型字段,引用类型字段则共享同一地址,修改一个对象的引用字段会影响其他对象;2. 深拷贝递归复制所有引用对象,生成完全独立的新对象,修改新对象不影响原对象。3. 实现深拷贝的方式包括手动递归复制、重写 clone() 方法、序列化与反序列化、使用第三方库等。4. 选择拷贝方式需根据场景决定:浅拷贝适用于引用对象不可变或需要共享的情况,深拷贝适用于需完全独立的场景。5. 实现深拷贝时需注意循环引用问题,可通过缓存已复制对象避免无限递归。6. 深拷贝性能开销较大,在高性能场景中应谨慎使用或采用优化策略。

Java中深拷贝和浅拷贝的区别 分析复制差异

深拷贝和浅拷贝,关键在于拷贝对象时,是否复制了对象内部的引用对象。浅拷贝只复制引用,深拷贝则会递归地复制所有引用对象,生成全新的独立对象。

Java中深拷贝和浅拷贝的区别 分析复制差异

深拷贝和浅拷贝的区别,本质上是对对象内部引用类型的处理方式不同。

Java中深拷贝和浅拷贝的区别 分析复制差异

浅拷贝的陷阱:共享的引用

浅拷贝,也叫影子拷贝,创建新对象时,只复制原始对象的非引用类型字段的值。对于引用类型字段,新对象只是复制了引用地址,这意味着新对象和原始对象共享同一个引用对象。修改其中一个对象的引用对象,另一个对象也会受到影响。例如:

立即学习“Java免费学习笔记(深入)”;

Java中深拷贝和浅拷贝的区别 分析复制差异
class Address {
    String city;

    public Address(String city) {
        this.city = city;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }
}

class Person {
    String name;
    Address address;

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

    public String getName() {
        return name;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    // 浅拷贝方法
    public Person shallowCopy() {
        return new Person(this.name, this.address);
    }
}

public class Main {
    public static void main(String[] args) {
        Address address = new Address("Beijing");
        Person person1 = new Person("Alice", address);

        Person person2 = person1.shallowCopy();

        // 修改 person2 的地址
        person2.getAddress().setCity("Shanghai");

        System.out.println("Person1's city: " + person1.getAddress().getCity()); // 输出 Shanghai
        System.out.println("Person2's city: " + person2.getAddress().getCity()); // 输出 Shanghai
    }
}
登录后复制


    相关文章