网站首页 > 精选教程 正文
深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在Java编程中与对象复制有关的两个概念,表面上看二者都可以实现对象的复制,但是在复制的方式以及实现效果上却有着很大的区别,下面我们就来详细介绍一下在Java中关于深拷贝和浅拷贝的原理以及它们之间的区别。
什么是浅拷贝?
所谓的浅拷贝是指在复制一个对象的时候,新的对象会得到原有对象的一个副本,但是这只是对于对象引用的复制,而对象中的属性还是指向原对象中的内存地址。
在复制过程中,对于基本数据类型数据就会被直接复制,而对于引用数据类型来讲,则会复制其引用的地址,这也就意味着新的对象和原有的对象中的变量都是指向原有的同一块内存区域。这也就是说浅拷贝只是复制原有对象的字段,对于引用类型只是引用复制,修改引用类型的值还是会影响原有对象。
如下所示,给出一个简单的浅拷贝的实现。
class Person {
String name;
int age;
// 构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class ShallowCopyExample {
public static void main(String[] args) {
Person person1 = new Person("John", 30);
Person person2 = person1; // 浅拷贝:person2引用了person1的地址
System.out.println("Before modification:");
System.out.println("person1.name = " + person1.name + ", person2.name = " + person2.name);
// 修改person2的属性
person2.name = "Mike";
System.out.println("After modification:");
System.out.println("person1.name = " + person1.name + ", person2.name = " + person2.name);
}
}
输出内容如下所示。
Before modification:
person1.name = John, person2.name = John
After modification:
person1.name = Mike, person2.name = Mike
从代码输出结果来看,因为person1和person2指向的是同一个内存地址,所以修改person2的值也会影响到person1。
什么是深拷贝?
深拷贝则是指在复制对象的时候,新的对象不仅会复制原有对象的基本数据类型的值,还会复制其应用对象数据类型并且会为其创建一个新的示例对象,并且将原有对象中的数据复制到新的对象中,所以对于深拷贝来讲,原有对象和新对象是两个完全独立的对象,因为它们所有的属性引用都指向了不同的内存空间中。
在深拷贝对象复制过程中,基本数据类型还是会被直接复制,而对于应用数据类型来讲,会创建新的对象,然后新对象也会复制原有对象中的内容,也就是说深拷贝不但复制了对象的属性而且还创建了新的引用,所以两个对象之间不会相互影响,如下所示。
class Person {
String name;
int age;
// 构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 深拷贝方法
public Person deepCopy() {
return new Person(this.name, this.age);
}
}
public class DeepCopyExample {
public static void main(String[] args) {
Person person1 = new Person("John", 30);
Person person2 = person1.deepCopy(); // 使用深拷贝
System.out.println("Before modification:");
System.out.println("person1.name = " + person1.name + ", person2.name = " + person2.name);
// 修改person2的属性
person2.name = "Mike";
System.out.println("After modification:");
System.out.println("person1.name = " + person1.name + ", person2.name = " + person2.name);
}
}
输出结果如下所示。
Before modification:
person1.name = John, person2.name = John
After modification:
person1.name = John, person2.name = Mike
从上面输出结果来看,person1和person2是两个完全独立的对象,所以修改person2的值不会影响到person1的值。
总结
在实际开发中,选择使用浅拷贝还是深拷贝取决于具体的需求。对于简单的对象,浅拷贝通常能满足需求,而对于复杂对象或需要避免副作用的场景,深拷贝则更加合适。
- 上一篇: Java语言的数据类型详解
- 下一篇: Java深入理解深拷贝和浅拷贝区别
猜你喜欢
- 2025-01-08 JVM(Java虚拟机)从0到1全部合集,强烈建议收藏
- 2025-01-08 你见过哪些实用到爆的 Java 代码技巧?
- 2025-01-08 2019最全的Java架构师面试120题解析(MySQL/Redis/架构/高并发等)
- 2025-01-08 Python元组与字典用法详解
- 2025-01-08 金蝶一面:Java基本数据类型有哪些?包装类型的常量池技术了解么
- 2025-01-08 阿里云Java实习岗面试记录整理(附答案详解)
- 2025-01-08 Java基础八股文背诵版
- 2025-01-08 Fury:一个基于JIT动态编译的高性能多语言原生序列化框架
- 2025-01-08 全网首发!马士兵内部共享—1658页《Java面试突击核心讲》
- 2025-01-08 百度文库不用会员也可复制文字
你 发表评论:
欢迎- 最近发表
-
- 我的世界光影MOD下载(我的世界光影mod下载安装)
- 我的世界1.7/1.8VoxelMap小地图MOD下载
- 我的世界1.7.10多世界 整合包(我的世界1.7.10forge整合包)
- 我的世界1.8最好用的修改器下载(我的世界1.8最好用的修改器下载安装)
- 我的世界更多弯曲动作MOD下载(我的世界更多弯曲动作mod下载手机版)
- 我的世界龙珠MOD下载(我的世界龙珠模组整合包下载)
- 我的世界1.7.10以太2 下载(我的世界以太2mod1.12.2)
- 我的世界虚拟人生MOD下载分享(我的世界虚拟人生下载安装)
- 我的世界无正版账号的简单联机方法(非网易版,仅适用于局域网)
- “我的语言极限,即是我的世界的极限。” ——《On Java》书籍推荐
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)