java深入理解深拷贝和浅拷贝的区别 如何实现深拷贝和浅拷贝
文章目录
- 一、拷贝简介
- 1.1 引用拷贝
- 1.2 对象拷贝
- 二、浅拷贝
- 2.1 定义
- 三、深拷贝
- 3.1 定义
一、拷贝简介
1.1 引用拷贝
创建一个指向对象的引用变量的拷贝
public class DemoCopy {public static void main(String[] args) {// 1. 引用拷贝:创建一个指向对象的引用变量的拷贝TempUser tempUser = new TempUser("张三",18);TempUser otherTempUser = tempUser;System.out.println(tempUser);System.out.println(otherTempUser);}
}class TempUser{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;}public TempUser(String name,int age){this.name = name;this.age = age;}
}
输出结果
com.TempUser@7ba4f24f
com.TempUser@7ba4f24f
结果分析
- 地址值相同,说明是同一对象
- tempUser 和 otherTempUser 只是引用
- 都指向了一个相同的对象,就叫做**引用拷贝
1.2 对象拷贝
public class DemoCopy {public static void main(String[] args) throws CloneNotSupportedException{// 对象拷贝TempUser tempUser = new TempUser("李四",18);TempUser otherTempUser = (TempUser) tempUser1.clone();System.out.println(tempUser);System.out.println(otherTempUser);}
}class TempUser implements Cloneable {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;}public TempUser(String name,int age){this.name = name;this.age = age;}// 重写Clone方法,将访问权限修改为publicpublic Object clone() throws CloneNotSupportedException {Object object = super.clone();return object;}
}
输出结果
com.TempUser@3b9a45b3
com.TempUser@7699a589
结果分析
- 地址不同,说明创建了新的对象
- 不是把原对象的地址赋给了一个新的引用变量,这就叫做对象拷贝
二、浅拷贝
2.1 定义
- 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象
- 即对象的浅拷贝会对主对象进行拷贝,但不会复制主对象里面的对象
- 里面的对象: 会在原来的对象和它的副本之间共享
- 简而言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象
- 浅拷贝只是增加了一个指针指向已存在的内存地址
public class DemoCopy {public static void main(String[] args) throws CloneNotSupportedException{// 浅拷贝Address address = new Address();address.setCountry("大陆");address.setProvince("天斗");TempUser tempUser2 = new TempUser();tempUser2.setName("王五");tempUser2.setAge(20);tempUser2.setAddress(address);TempUser tempUser3 = (TempUser) tempUser2.clone();System.out.println(tempUser2.getName() + " | " + tempUser2.getAge() + " | " + tempUser2.getAddress().getCountry() + " | " + tempUser2.getAddress().getProvince());System.out.println(tempUser3.getName() + " | " + tempUser3.getAge() + " | " + tempUser3.getAddress().getCountry() + " | " + tempUser3.getAddress().getProvince());System.out.println("------修改地址信息后------");address.setCountry("苍穹");address.setProvince("乌坦");System.out.println(tempUser2.getName() + " | " + tempUser2.getAge() + " | " + tempUser2.getAddress().getCountry() + " | " + tempUser2.getAddress().getProvince());System.out.println(tempUser3.getName() + " | " + tempUser3.getAge() + " | " + tempUser3.getAddress().getCountry() + " | " + tempUser3.getAddress().getProvince());}
}class TempUser implements Cloneable {private String name;private int age;private Address address;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 Address getAddress(){return address;}public void setAddress(Address address){this.address = address;}public TempUser(){}public TempUser(String name,int age){this.name = name;this.age = age;}public TempUser(String name,int age,Address address){this.name = name;this.age = age;this.address = address;}// 重写Clone方法,将访问权限修改为publicpublic Object clone() throws CloneNotSupportedException {Object object = super.clone();return object;}
}class Address implements Cloneable{private String country;private String province;public String getCountry(){return country;}public void setCountry(String country){this.country = country;}public String getProvince(){return province;}public void setProvince(String province){this.province = province;}public Address(){}public Address(String country,String province){this.country = country;this.province = province;}
}
输出结果
王五 | 20 | 大陆 | 天斗
王五 | 20 | 大陆 | 天斗
------修改地址信息后------
王五 | 20 | 苍穹 | 乌坦
王五 | 20 | 苍穹 | 乌坦
结果分析
- 两个引用 tempUser2 和 tempUser3 指向不同的两个对象
- 两个引用 tempUser2 和 tempUser3 中的两个address引用指向的是同一个对象,所以说明是浅拷贝
三、深拷贝
3.1 定义
- 深拷贝是一整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存
- 当对象和它所引用的对象一起拷贝时即发生深拷贝
- 深拷贝相比于浅拷贝速度较慢并且花销较大
- 简而言之,深拷贝把要复制的对象所引用的对象都复制了一遍
- 深拷贝是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存
- 使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误
public class DemoCopy {public static void main(String[] args) throws CloneNotSupportedException{// 深拷贝Address address1 = new Address();address1.setCountry("遮天");address1.setProvince("天庭");TempUser tempUser4 = new TempUser();tempUser4.setName("赵六");tempUser4.setAge(18);tempUser4.setAddress(address1);TempUser tempUser5 = (TempUser) tempUser4.clone();System.out.println(tempUser4.getName() + " | " + tempUser4.getAge() + " | " + tempUser4.getAddress().getCountry() + " | " + tempUser4.getAddress().getProvince());System.out.println(tempUser5.getName() + " | " + tempUser5.getAge() + " | " + tempUser5.getAddress().getCountry() + " | " + tempUser5.getAddress().getProvince());System.out.println("------修改地址信息后------");address1.setCountry("完美");address1.setProvince("世界");System.out.println(tempUser4.getName() + " | " + tempUser4.getAge() + " | " + tempUser4.getAddress().getCountry() + " | " + tempUser4.getAddress().getProvince());System.out.println(tempUser5.getName() + " | " + tempUser5.getAge() + " | " + tempUser5.getAddress().getCountry() + " | " + tempUser5.getAddress().getProvince());}
}class TempUser implements Cloneable {private String name;private int age;private Address address;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 Address getAddress(){return address;}public void setAddress(Address address){this.address = address;}public TempUser(){}public TempUser(String name,int age){this.name = name;this.age = age;}public TempUser(String name,int age,Address address){this.name = name;this.age = age;this.address = address;}// 重写Clone方法,将访问权限修改为publicpublic Object clone() throws CloneNotSupportedException {// 浅复制/*Object object = super.clone();return object;*/// 深复制TempUser tempUser = (TempUser) super.clone();tempUser.setAddress((Address) tempUser.getAddress().clone());return tempUser;}
}class Address implements Cloneable{private String country;private String province;public String getCountry(){return country;}public void setCountry(String country){this.country = country;}public String getProvince(){return province;}public void setProvince(String province){this.province = province;}public Address(){}public Address(String country,String province){this.country = country;this.province = province;}public Object clone() throws CloneNotSupportedException {// 浅复制Object object = super.clone();return object;}
}
输出结果
赵六 | 18 | 遮天 | 天庭
赵六 | 18 | 遮天 | 天庭
------修改地址信息后------
赵六 | 18 | 完美 | 世界
赵六 | 18 | 遮天 | 天庭
结果分析
- 两个引用 tempUser4 和 tempUser5 指向不同的两个对象
- 两个引用 tempUser4 和 tempUser5 中的两个 address1 引用指向的是两个对象
- 对 address1 对象的修改只能影响 tempUser4 对象,所以说是深拷贝
java深入理解深拷贝和浅拷贝的区别 如何实现深拷贝和浅拷贝相关推荐
- java -- 深拷贝和浅拷贝的区别 如何实现深拷贝和浅拷贝
文章目录 1. 深拷贝和浅拷贝的区别 1.1 浅拷贝实例 1.1.1 测试1 直接赋值 1.1.2 测试2 改变源对象的值 1.2 深拷贝实例 `这是用于深拷贝的测试类` 1.2.1 方法一: 构造函 ...
- Java 深入理解深拷贝和浅拷贝区别
title: Java 深入理解深拷贝和浅拷贝区别 date: 2021-6-19 updated: 2021-6-19 tags: Java 深拷贝和浅拷贝 categories: 面试 Java ...
- Java基础-深拷贝和浅拷贝的区别
深拷贝与浅拷贝 一般来说,拷贝的类型分为 深拷贝与浅拷贝. |-----------------------------| | 深拷贝:引用对象的值等信息,复制一份一样的. | ...
- 简单理解深拷贝和浅拷贝的区别
下面搜集的写的比较好的博客 大嘎可以看一下 https://www.cnblogs.com/mikeCao/p/8710837.html 简单来说 浅拷贝和深拷贝最主要的区别:否是开辟的新的内存 也就 ...
- java深入理解浅拷贝和深拷贝
文章目录 简介 拷贝接口 使用clone导致的浅拷贝 使用clone的深拷贝 不要overridden clone 总结 简介 拷贝对象是java中经常会遇到的问题.java中存在两种类型,基础类型和 ...
- Python中深拷贝与浅拷贝的区别?
往期面试题: 列举Python中的标准异常类? 说说Python面向对象三大特性? 说说Python中有几种数据类型? 说说Python模块主要分哪三类? 废话不多说,开始今天的题目: 问:说说Pyt ...
- C++深拷贝与浅拷贝的区别-简单易懂
C++深拷贝与浅拷贝的区别-简单易懂 介绍 浅拷贝就比如像引用类型,而深拷贝就比如值类型. 浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同).对其中任何一个对象的改动都会影响另 ...
- 【C++面试问答】搞清楚深拷贝与浅拷贝的区别
问题 深拷贝和浅拷贝的区别是面试中的常见问题之一,对于不同的编程语言,这个问题的回答可能稍有差别,下面我们就来探索一下它们之间的异同吧. 先来看看在JavaScript对象的深拷贝与浅拷贝的区别: 浅 ...
- 如何完美解答面试问题——深拷贝和浅拷贝的区别
大家好,我是孤焰.今天要谈一谈在面试过程中可能被面试官提到的一个问题--深拷贝和浅拷贝的区别? 由于我也是刚刚学习编程的小白,所以此篇博文将参考了多篇博文,最后总结而成. 最近由于多门考试临近,所以博 ...
最新文章
- 可以不封神,但是不能不修炼——亚特兰蒂斯之神特斯拉的启示
- 公司内部图书管理界面原型设计图
- git作死之天坑记录
- centos6安装mysql并远程连接_如何开启phpstudy中mysql的远程连接
- 超3000岗位!腾讯产业互联网新年大扩招!
- Solr4.8.0源码分析(13)之LuceneCore的索引修复
- messagebox
- 软件测试流程(完整版)
- MySQL安装及使用手册
- edem合成运动教程
- python --离线识别图片中文字(easyocr)
- Room的基本使用(一)
- gridsome(三)——plugins
- 前端 mockjs模拟数据
- 理解CMMI 3级过程域非常好的例子
- TCX推出前沿货币债券指数
- 终于!疫情之下,第一批企业没能熬住面临倒闭,员工被遣散,没能等来春暖花开!...
- 计算机系统构成及硬件基础知识(中级软件评测师备考笔记)
- “道德”,究竟是保镖还是杀手?
- 366AP微信中可以下载企业包
热门文章
- day03_20170514_字符编码/文件存储/函数(一)
- 如何将原来Eclipse的一个工作空间设置好的界面复制到另外一个Eclipse里面
- echarts饼图显示比例
- 计算机毕设项目 python微信公众平台机器人
- 第七章 在网页中嵌入多媒体内容
- “卖惨”的悲情牌打多了,营销终将变“悲剧”
- 一个故事带你了解集线器、交换机与路由器
- H.264压缩算法详解
- 如何将图片的背景色去掉?怎样快速去除背景色?
- linux 博通wifi驱动,博通WiFi驱动