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

浅拷贝和深拷贝

浅拷贝VS深拷贝
浅拷贝
demo
深拷贝
结果
浅拷贝和深拷贝的场景
优化拷贝
问题
其他方式
浅拷贝VS深拷贝
只复制指向某个对象的指针,不复制对象本身,新旧对象共享一个块内存

复制并创建一个一模一样的对象,不共享内存,修改新对象,旧对象保持不变

浅拷贝
demo

package com.jysemel.java.basic;

public class Demo {

private String name;
private int age;public String getName() {return name;
}public void setName(String name) {this.name = name;
}public int getAge() {return age;
}public void setAge(int age) {this.age = age;
}

}

package com.jysemel.java.basic;

public class Main {
public static void main(String[] args) {
Demo demo = new Demo();
demo.setName("jysemel");
demo.setAge(18);

    System.out.println(demo.getName());Demo demo1 = demo;demo1.setName("jysemel1");System.out.println(demo.getName());System.out.println(demo1.getName());
}

}
深拷贝
实现 Cloneable 接口,并重写 clone 方法

package com.jysemel.java.basic;

import lombok.SneakyThrows;

import java.util.List;

public class Demo1 implements Cloneable{

private String name;
private int age;private List<String> list;public String getName() {return name;
}public void setName(String name) {this.name = name;
}public int getAge() {return age;
}public void setAge(int age) {this.age = age;
}public List<String> getList() {return list;
}public void setList(List<String> list) {this.list = list;
}@SneakyThrows
@Override
public Demo1 clone() {return (Demo1) super.clone();
}@Override
public String toString() {return "Demo1{" +"name='" + name + '\'' +", age=" + age +", list=" + list +'}';
}

}

package com.jysemel.java.basic;

import java.util.ArrayList;
import java.util.List;

public class Main1 {
public static void main(String[] args) {
List list = new ArrayList<>();
Demo1 demo = new Demo1();
demo.setName("jysemel");
demo.setAge(18);
demo.setList(list);
demo.getList().add("2");

    System.out.println(demo.getName());Demo1 demo1 = demo.clone();demo1.setAge(19);demo1.setName("jysemel1");demo.getList().add("4");System.out.println(demo);System.out.println(demo1);
}

}
结果

Demo1{name='jysemel', age=18, list=[2, 4]}
Demo1{name='jysemel1', age=19, list=[2, 4]}
String 对象一旦创建,内容不会变,修改会创建新对象,不会改变原来的对象

list 引用类型,没有进行深拷贝,修改会改变原来的对象

浅拷贝和深拷贝的场景

1、避免线程间共享可变状态导致线程安全问题,可传递该对象的深拷贝副本
2、DTO(数据传输对象)转换
3、缓存快照
优化拷贝
问题

1、对象嵌套层次越深,深拷贝的开销就越大
2、对于大量对象的复制操作,深拷贝可能导致性能下降
其他方式
其一 序列化 demo

package com.jysemel.java.basic.demo3;

import java.io.*;

public class Dept implements Serializable {

private static final long serialVersionUID = 1L;private String name;
private String address;public String getName() {return name;
}public void setName(String name) {this.name = name;
}public String getAddress() {return address;
}public void setAddress(String address) {this.address = address;
}@Override
public String toString() {return "Dept{" +"name='" + name + '\'' +", address='" + address + '\'' +'}';
}public Dept(String name, String address) {this.name = name;this.address = address;
}// 深拷贝方法:利用序列化
Dept deepCopy() {try {// 写入字节数组流ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(this);oos.close();// 从字节数组流读取ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);return (Dept) ois.readObject();} catch (Exception e) {throw new RuntimeException(e);}
}

}

package com.jysemel.java.basic.demo3;

public class SimpleDeepCopyDemo {

public static void main(String[] args) {Dept p1 = new Dept("张三", "333");// 深拷贝Dept p2 = p1.deepCopy();// 打印原始和副本System.out.println("原始: " + p1);System.out.println("副本: " + p2);// 修改副本的基本类型字段p2.setName("李四");p2.setAddress("李四33");// 再次打印,观察原始对象是否被影响System.out.println("\n修改副本后:");System.out.println("原始: " + p1); // 原始对象不受影响System.out.println("副本: " + p2);
}

}

http://www.jsqmd.com/news/374729/

相关文章:

  • Java毕设项目:基于springboot的线上陪玩店系统(源码+文档,讲解、调试运行,定制等)
  • 2026年半导体行业展会推荐:适合半导体企业参展参观的专业展会 - 品牌2025
  • 法律服务呼叫中心系统 正规靠谱厂商甄选 - 资讯焦点
  • npm install express -g 报错4058...如何解决?
  • Python 实现 PDF 表单域的自动化创建与智能填充 - E
  • 文旅行业用呼叫中心系统,哪款效率更高更实用? - 资讯焦点
  • 分期乐万通金券最简单的变现方法,教你快速回收变现! - 团团收购物卡回收
  • 想找教育行业呼叫中心?哪个好用又稳定 - 资讯焦点
  • 计算机毕业设计之基于SpringBoot的大学生体测管理系统
  • 收藏!海关检测光谱分析仪租赁平台有哪些 - 资讯焦点
  • 技术视角解析雷达系统架构:天硕工业级 SSD 成为关键部件的核心原因 - 资讯焦点
  • 在麒麟系统上安装Qwen3-TTS文字转语音
  • 【课程设计/毕业设计】基于springboot的小区饮用水生活用水水务系统基于springboot的小区水务系统设计与实现【附源码、数据库、万字文档】
  • 国内知名半导体行业展会完整名单 行业公认优质展会汇总 - 品牌2025
  • 高性价比!消费品检测色谱仪租赁企业推荐 - 资讯焦点
  • 物流企业呼叫中心系统 精选供应商名单 - 资讯焦点
  • Java毕设项目:基于springboot的小区水务系统设计与实现(源码+文档,讲解、调试运行,定制等)
  • 安全防脱发标杆,2026实测产后防脱洗发水权威排行榜,发根强韧不秃顶 - 资讯焦点
  • Java计算机毕设之基于springboot的小区水务系统设计与实现基于springboot的小区饮用水生活用水水务系统(完整前后端代码+说明文档+LW,调试定制等)
  • 【毕业设计】基于springboot的小区水务系统设计与实现(源码+文档+远程调试,全bao定制等)
  • 2026年国内知名半导体行业展会详细介绍:展会规模与亮点汇总 - 品牌2025
  • AI专著生成新趋势!专业工具推荐,快速产出高质量专著
  • 期货反向跟单:在亏损阵痛中把握盈利先机
  • AI专著生成工具大盘点,助你在专著写作路上快人一步
  • 【Oracle】MMNL占用内存过高问题,重启进程释放
  • 2026 疾控光谱分析仪租赁靠谱企业推荐 - 资讯焦点
  • AI专著撰写秘籍:实用工具推荐,助你快速完成专业学术专著
  • 谁是 AI 写论文天花板?2026 软件排行榜大揭秘
  • 2026变频器选购指南:如何选对适配工业场景的高价值解决方案 - 速递信息
  • 水利设施人车混行通道三维行为建模与冲突风险预警技术方案——以空间级轨迹融合与冲突推演构建“可测可控”的通道安全智能防控体系