java,深拷贝和浅拷贝

在 Java 中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是对象拷贝的两种方式,主要区别在于它们如何处理对象的内部引用。

目录

一、浅拷贝(Shallow Copy)

实现方式

二、深拷贝(Deep Copy)

实现方式

1、手动深拷贝

2、通过序列化实现深拷贝

深拷贝中的注意事项

深拷贝的应用场景

总结


一、浅拷贝(Shallow Copy)

浅拷贝是指仅拷贝对象的基本类型字段引用类型字段的引用,而不是引用类型所指向的对象本身。因此,浅拷贝后的对象与原对象的引用类型字段共享相同的对象。如果原对象或拷贝对象中的引用类型被修改,两个对象都会受到影响。

实现方式

通过 clone() 方法实现浅拷贝。需要类实现 Cloneable 接口,并重写 clone() 方法。

class Person implements Cloneable {
    String name;
    int age;
    Address address;

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

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

class Address {
    String city;

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

public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Address address = new Address("New York");
        Person person1 = new Person("John", 25, address);
        Person person2 = (Person) person1.clone();  // 浅拷贝
        System.out.println(person1.address.city);  // 输出 "New York"
        System.out.println(person2.address.city);  // 输出 "New York"

        person2.address.city = "Los Angeles";
        System.out.println(person1.address.city);  // 输出 "Los Angeles",由于是浅拷贝,两者共享相同的地址引用
    }
}

在这个例子中,person1person2 共享同一个 Address 对象,修改 person2<

JAVA中的深拷贝浅拷贝是对象拷贝的两种方式。深拷贝是一个整个独立的对象拷贝,会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象它所引用的对象一起拷贝时即发生深拷贝深拷贝相比于浅拷贝速度较慢并且花销较大。要实现深拷贝,可以在拷贝构造方法中,对引用数据类型变量逐一开辟新的内存空间,创建新的对象,这样可以实现深拷贝。而对于一般的拷贝构造,则一定是浅拷贝。此外,可以通过简洁的代码实现深拷贝,但要注意的是,如果某个属性被transient修饰,那么该属性就无法被拷贝了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java深入理解深拷贝浅拷贝区别](https://blog.csdn.net/riemann_/article/details/87217229)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Java 浅拷贝深拷贝的理解实现方式](https://blog.csdn.net/weixin_30662011/article/details/96181137)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值