当前位置: 首页 > news >正文

Java对象克隆:从浅到深的奥秘

浅克隆与深克隆在Java中的应用及区别

核心概念
  1. 浅克隆
    复制对象时仅克隆基本数据类型字段,引用类型字段共享原对象引用。实现方式:
class Person implements Cloneable {String name;Address address; // 引用类型字段@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone(); // 默认浅克隆}
}class Address {String city;
}

     2.深克隆
        完全独立复制对象及其关联对象:

class DeepPerson implements Cloneable {String name;Address address;@Overrideprotected Object clone() throws CloneNotSupportedException {DeepPerson cloned = (DeepPerson) super.clone();cloned.address = new Address(); // 新建独立地址对象cloned.address.city = this.address.city;return cloned;}
}

应用场景对比
特性浅克隆深克隆
内存消耗低(共享引用)高(创建新对象)
数据隔离性弱(修改影响原对象)强(完全隔离)
实现复杂度简单(自动实现)复杂(需递归处理)
适用场景不可变对象/简单结构复杂对象层级/需要隔离修改
深度克隆进阶实现
  1. 序列化方案(需实现Serializable接口)
import java.io.*;class SerialCloneable implements Serializable {public Object deepClone() throws IOException, ClassNotFoundException {try (ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos)) {oos.writeObject(this);try (ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis)) {return ois.readObject();}}}
}

     2.嵌套对象克隆测试

public static void main(String[] args) throws Exception {// 浅克隆测试Address addr = new Address("Beijing");Person original = new Person("Alice", addr);Person cloned = (Person) original.clone();cloned.address.city = "Shanghai";System.out.println(original.address.city); // 输出"Shanghai"// 深克隆测试DeepPerson deepOriginal = new DeepPerson("Bob", new Address("Guangzhou"));DeepPerson deepClone = (DeepPerson) deepOriginal.clone();deepClone.address.city = "Shenzhen";System.out.println(deepOriginal.address.city); // 保持"Guangzhou"
}

核心差异总结
  1. 对象关系拓扑:

    • 浅克隆:生成对象图与原对象共享叶节点
    • 深克隆:构建完全独立的对象树
  2. 内存模型表现: 

      

      3.修改传播特性:

       

最佳实践建议
  1. 优先考虑不可变对象设计
  2. 复杂对象推荐使用深克隆框架(如Apache Commons Lang3的SerializationUtils)
  3. 对于循环引用结构,需实现引用追踪机制
  4. 注意克隆过程中静态字段的处理

相关文章:

  • 最卸载器——Geek Uninstaller 使用指南
  • [SC]SystemC在CPU/GPU验证中的应用(三)
  • 79. 单词搜索-极致优化,可行性剪枝和顺序剪枝
  • L56.【LeetCode题解】 电话号码的字母组合
  • Python打卡训练营学习记录Day41
  • NW994NX734美光固态闪存NX737NX740
  • Redis缓存问题重点详解
  • 三步问题 --- 动态规划
  • 快速阅读源码
  • 目前主流图像分类模型的详细对比分析
  • 8088单板机C语言sprintf()格式化串口输出---Prj04
  • 【Net】TCP粘包与半包
  • 算法打卡12天
  • Microsoft Word使用技巧分享(本科毕业论文版)
  • 【SLAM自救笔记1】:苟活
  • Unity中的AudioManager
  • Unity程序集
  • 当前用户的Git本地配置情况:git config --local --list
  • 通讯方式学习——单总线协议(2024.04.09)
  • 小红书 发评论 分析 x-s x-t
  • 甘肃兰州网站建设/口碑营销的优势
  • 用javascript做的网站/深圳市网络营销推广服务公司
  • 手机网站设计报价/关键一招
  • 商务网站的主要存在形式/商丘seo教程
  • 用哪个平台做网站好/seo优化收费
  • 广州网站建设信科网络/免费注册网址