# 浅拷贝与深拷贝的自我介绍
先了解下他们代表的含义
# 浅拷贝(Shallow Copy)
仅拷贝对象的引用(指针), 不拷贝对象本身.
# 深拷贝(Deep Copy)
拷贝对象内存到另一块新的内存中.
# 在Java中他们有点不一样
所有的高级语言都有相关的应用, 那他们在Java中有什么不同呢?
Java中分为
基础数据类型和引用数据类型, 并且在Java中只有值传递(想了解值传递可以参考这篇文章值传递和引用传递), 所以Java不存在拷贝引用, 都是对值的拷贝.浅拷贝是对值的拷贝, 基础数据类型直接拷贝值, 新变量对其修改, 不会影响之前变量的值.
深拷贝是将
对象图整体进行了拷贝, 放在里新的heap上.
对象图代表一个对象向下所包含的所有属性(包括对象属性中的属性), 由此好似形成了一幅对象关系图.
# 在Java中是怎么使用的
# 浅拷贝
- clone()方法实现
# 深拷贝
- 对象中的全部引用类型属性(向里穷尽)都实现clone()
- 序列化与反序列化
#
# 有哪些工具类来帮助我们
- Apache BeanUtil.CopyProperties
- Apache PropertyUtils.CopyProperties
- Spring BeanUtils.CopyProperties
- cglib BeanCopier
- Kyro
- google protobuf
- orika
# FAQ
# 为什么String类型通过常量赋值时相当于基本数据类型,通过new关键字创建对象时便是引用数据类型?
String str1 = “ABC”;可能创建一个或者不创建对象,如果”ABC”这个字符串在java String池里不存在,会在java String池里创建一个创建一个String对象(“ABC”),然后str1指向这个内存地址,无论以后用这种方式创建多少个值为”ABC”的字符串对象,始终只有一个内存地址被分配,之后的都是String的拷贝,Java中称为“字符串驻留”,所有的字符串常量都会在编译之后自动地驻留。
String str2 = new String(“ABC”);至少创建一个对象,也可能两个。因为用到new关键字,肯定会在heap中创建一个str2的String对象,它的value是“ABC”。同时如果这个字符串再java String池里不存在,会在java池里创建这个String对象“ABC”