返回

深入解析深拷贝与浅拷贝,轻松理解引用类型和基本类型的奥秘

前端

深拷贝与浅拷贝:内存图解析

为了更直观地理解深拷贝和浅拷贝之间的区别,我们通过内存图来进行演示。

浅拷贝

浅拷贝是一种简单的复制方式,它只复制对象本身,而不复制对象所引用的其他对象。当我们对浅拷贝的对象进行修改时,原始对象也会受到影响,因为它们指向相同的内存地址。

Person p1 = new Person("John", 25);
Person p2 = p1;

p2.setName("Mary");
p2.setAge(30);

System.out.println(p1.getName()); // Mary
System.out.println(p1.getAge()); // 30

在上面的代码中,我们创建了两个Person对象p1和p2,并通过p2 = p1将p1赋给p2。这是一种浅拷贝,意味着p2和p1指向相同的内存地址。当我们修改p2的属性时,p1的属性也会受到影响,因为它们指向相同的数据。

深拷贝

深拷贝是一种更彻底的复制方式,它不仅复制对象本身,还复制对象所引用的其他对象。当我们对深拷贝的对象进行修改时,原始对象不会受到影响,因为它们指向不同的内存地址。

Person p1 = new Person("John", 25);
Person p2 = new Person(p1.getName(), p1.getAge());

p2.setName("Mary");
p2.setAge(30);

System.out.println(p1.getName()); // John
System.out.println(p1.getAge()); // 25

在上面的代码中,我们创建了两个Person对象p1和p2,并通过p2 = new Person(p1.getName(), p1.getAge())将p1赋给p2。这是一种深拷贝,意味着p2和p1指向不同的内存地址。当我们修改p2的属性时,p1的属性不会受到影响,因为它们指向不同的数据。

引用类型和基本类型

在Java中,数据类型分为两种:引用类型和基本类型。

引用类型

引用类型是指存储其他对象地址的变量。引用类型的变量可以指向对象,也可以指向null。当我们对引用类型变量进行赋值时,实际上是将对象的地址赋给了变量。

基本类型

基本类型是指直接存储数据的变量。基本类型变量只能存储数值、字符或布尔值。当我们对基本类型变量进行赋值时,实际上是将数据本身赋给了变量。

深拷贝和浅拷贝的应用场景

浅拷贝

浅拷贝通常用于复制不需要修改的对象,例如字符串和数字。

深拷贝

深拷贝通常用于复制需要修改的对象,例如对象和数据结构。

总结

深拷贝和浅拷贝是两种不同的复制方式,它们的区别在于深拷贝复制对象本身及其所引用的其他对象,而浅拷贝只复制对象本身。在编程中,根据不同的需求,可以选择使用深拷贝或浅拷贝。