Java基础篇--浅拷贝和深拷贝

概念 

浅拷贝(Shallow Copy)和深拷贝(Deep Copy)是在对象复制过程中常用的概念。

  • 浅拷贝是指创建一个新对象,并将原始对象的非静态字段的值拷贝到新对象中。如果字段是基本数据类型,直接复制其值;如果字段是引用类型,复制的是引用而不是对象本身。因此,在浅拷贝中,新旧对象共享引用类型字段所指向的对象。
  • 深拷贝是指创建一个新对象,并将原始对象的所有字段的值拷贝到新对象中,包括引用类型字段所指向的对象。通过深拷贝,可以实现两个独立的对象,彼此之间没有任何关联。修改其中一个对象的字段值不会影响另一个对象的字段值。

选择使用浅拷贝还是深拷贝取决于实际需求。如果希望复制对象后的修改不会影响原始对象,应该使用深拷贝;如果可以接受复制对象的修改影响原始对象,或者对象较大且复制性能要求高,则可以使用浅拷贝。

综上所述:

  1. 浅拷贝:

    • 对于简单对象(如基本数据类型),直接复制其值。
    • 对于引用类型字段,复制其引用而不是对象本身。

    结果是,原始对象和复制对象之间共享相同的引用,对原始对象的修改会影响到复制对象,但是对于引用类型字段指向的对象本身的修改则不会影响。

  2. 深拷贝:

    • 对于简单对象和引用类型字段,分别递归地创建它们的独立副本,保证复制对象与原始对象完全独立。

    结果是,原始对象和复制对象之间没有任何引用关系,彼此独立存在,修改其中一个对象不会影响另一个对象。

可以这么理解,从A这里复制出来了一个B,此时我修改了A的对象,而B的对象也跟着改变,这则是浅拷贝。相反,我修改了A的对象,而B的对象不跟着改变,这便是深拷贝。

示例代码:

//创建一个类Person
class Person {
 String name;
 int age;
 
 // 构造函数
 public Person(String name, int age) {
     this.name = name;
     this.age = age;
 }
 
 // 重写toString方法
 @Override
 public String toString() {
     return "Person [name=" + name + ", age=" + age + "]";
 }
}

public class myclass {
 public static void main(String[] args) {
     // 创建一个Person对象
     Person person1 = new Person("John", 25);
     
     // 浅拷贝示例
     Person person2 = person1; // 直接将person1的引用赋值给person2
     person2.age = 30; // 修改person2的属性,也会影响到person1
     
     System.out.println("浅拷贝示例:");
     System.out.println("person1: " + person1);//运行结果:person1: Person [name=John, age=30]
     System.out.println("person2: " + person2);//运行结果:person2: Person [name=John, age=30]
     
     // 深拷贝示例
     Person person3 = new Person(person1.name, person1.age); // 创建新的Person对象,将person1的属性值复制给person3
     person3.age = 35; // 修改person3的属性,不会影响到person1
     
     System.out.println("深拷贝示例:");
     System.out.println("person1: " + person1);//运行结果:person1: Person [name=John, age=30]
     System.out.println("person3: " + person3);//运行结果:person3: Person [name=John, age=35]
 }
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

正在奋斗的程序猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值