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

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

浅拷贝的陷阱:共享的引用
浅拷贝,也叫影子拷贝,创建新对象时,只复制原始对象的非引用类型字段的值。对于引用类型字段,新对象只是复制了引用地址,这意味着新对象和原始对象共享同一个引用对象。修改其中一个对象的引用对象,另一个对象也会受到影响。例如:
立即学习“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 } }
文章标题:Java中深拷贝和浅拷贝的区别 分析复制差异
文章链接:https://www.onehaoka.com/2917.html
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明来自磁力搜索 !
Go 进程间通信:共享内存 vs. 通道
本文探讨了 Go 语言中进程间通信(IPC)的两种主要方法:共享内存和通道。通过对比这两种方法的优缺点,并结合实际应用场景,阐述了如何利用通道封装底层 IP
2025年07月07日
mysql索引怎么用 mysql创建索引提高查询性能方法
索引是mysql中提高查询性能的关键工具,它类似于书籍目录,可快速定位数据。创建索引主要使用create index或alter table语句,例如:cre
2025年07月07日
OPC UA:动态检测和转换自定义方法输入参数
在使用 OPC UA 客户端与服务器交互时,动态检测和转换自定义方法的输入参数类型至关重要。本文将介绍如何通过读取方法节点的 "0:InputArgumen
2025年07月07日
Go 并发通信:共享内存与 Channel 的进程间通信
本文旨在探讨 Go 语言中进程间通信的两种方式:共享内存和 Channel。重点分析如何利用 Channel 实现跨进程通信,并讨论其与传统 IPC 方法的
2025年07月07日
使用 Chart.js 控制柱状图 Y 轴范围
本文档旨在指导开发者如何使用 Chart.js 库来精确控制柱状图的 Y 轴显示范围,避免因数据范围过小而导致视觉上的误导。通过设置 min、max 和 s
2025年07月07日
p5.js 文本渲染与图像加载最佳实践
本文旨在解决 p5.js 中常见的文本重复渲染问题,深入剖析其根源:draw() 函数的连续执行机制和异步资源加载。我们将探讨如何利用 preload()
2025年07月07日
什么是稳定币?类型、优点和风险详细说明
稳定币,顾名思义,是价值相对稳定的数字资产,旨在解决传统加密货币波动性大的问题。它们通常与某种法币(如美元)、商品(如黄金)或另一种加密货币挂钩,以维持其价格
2025年07月07日
使用 jQuery 动态创建按钮组:一种高效的方法
本文将介绍如何使用 jQuery 从数据源动态生成一系列按钮,并将其组织成具有特定结构的 HTML。通过分割数据并使用 map 函数,可以高效地创建包含链接
2025年07月07日
最新评论