- 再创建一个工作类
// 工作的实体类,需要实现Cloneable接口public class Job implements Cloneable {private String content;public String getContent() {return content;}public void setContent(String content) {this.content = content;}@Overrideprotected Job clone() throws CloneNotSupportedException {return (Job) super.clone();}}
- 测试浅拷贝
/** * @author 一灯架构 * @apiNote Java深拷贝示例 **/public class Demo {public static void main(String[] args) throws CloneNotSupportedException {// 1. 创建用户对象,{"name":"一灯架构","job":{"content":"开发"}}User user1 = new User();user1.setName("一灯架构");Job job1 = new Job();job1.setContent("开发");user1.setJob(job1);// 2. 拷贝用户对象,name修改为"张三",工作内容修改"测试"User user2 = user1.clone();user2.setName("张三");Job job2 = user2.getJob();job2.setContent("测试");// 3. 输出结果System.out.println("user原对象= " + user1);System.out.println("user拷贝对象= " + user2);}}
输出结果:user原对象= {"name":"一灯架构","job":{"content":"开发"}}user拷贝对象= {"name":"张三","job":{"content":"测试"}}
从结果中可以看出,user拷贝对象修改了name属性和Job对象中内容,都没有影响到原对象,实现了深拷贝 。通过实现Cloneable接口的方式来实现深拷贝,是Java中最常见的实现方式 。
缺点是: 比较麻烦,需要所有实体类都实现Cloneable接口,并重写clone方法 。如果实体类中新增了一个引用对象类型的属性,还需要添加到clone方法中 。如果继任者忘了修改clone方法,相当于挖了一个坑 。
3.2 使用JSON字符串转换实现方式就是:
- 先把user对象转换成json字符串
- 再把json字符串转换成user对象
下面使用fastjson实现,使用Gson、Jackson也是一样的:
import com.alibaba.fastjson.JSON;/** * @author 一灯架构 * @apiNote Java深拷贝示例 **/public class Demo {public static void main(String[] args) throws CloneNotSupportedException {// 1. 创建用户对象,{"name":"一灯架构","job":{"content":"开发"}}User user1 = new User();user1.setName("一灯架构");Job job1 = new Job();job1.setContent("开发");user1.setJob(job1);//// 2. 拷贝用户对象,name修改为"张三",工作内容修改"测试"User user2 = JSON.parseObject(JSON.toJSONString(user1), User.class);user2.setName("张三");Job job2 = user2.getJob();job2.setContent("测试");// 3. 输出结果System.out.println("user原对象= " + JSON.toJSONString(user1));System.out.println("user拷贝对象= " + JSON.toJSONString(user2));}}
输出结果:user原对象= {"name":"一灯架构","job":{"content":"开发"}}user拷贝对象= {"name":"张三","job":{"content":"测试"}}
从结果中可以看出,user拷贝对象修改了name属性和Job对象中内容,并没有影响到原对象,实现了深拷贝 。3.3 集合实现深拷贝再说一下Java集合怎么实现深拷贝?
其实非常简单,只需要初始化新对象的时候,把原对象传入到新对象的构造方法中即可 。
以最常用的ArrayList为例:
/** * @author 一灯架构 * @apiNote Java深拷贝示例 **/public class Demo {public static void main(String[] args) throws CloneNotSupportedException {// 1. 创建原对象List<User> userList = new ArrayList<>();// 2. 创建深拷贝对象List<User> userCopyList = new ArrayList<>(userList);}}
我是「一灯架构」,如果本文对你有帮助,欢迎各位小伙伴点赞、评论和关注,感谢各位老铁,我们下期见

文章插图
经验总结扩展阅读
- 哪些星座会与爱情死磕?
- JAVA开发搞了一年多的大数据,究竟干了点啥
- JAVA的File对象
- Java 超新星开源项目 Solon v1.10.10 发布
- 将java装进u盘指南
- Java函数式编程:三、流与函数式编程
- 2022,一个Java程序猿的外设配置
- 2022,一个Java程序猿的装机配置
- Java 多线程写zip文件遇到的错误 write beyond end of stream!
- 1 JAVA语言学习-面向对象