# 浅拷贝与深拷贝的自我介绍

先了解下他们代表的含义

# 浅拷贝(Shallow Copy)

仅拷贝对象的引用(指针), 不拷贝对象本身.

# 深拷贝(Deep Copy)

拷贝对象内存到另一块新的内存中.

# 在Java中他们有点不一样

所有的高级语言都有相关的应用, 那他们在Java中有什么不同呢?

Java中分为基础数据类型引用数据类型, 并且在Java中只有值传递(想了解值传递可以参考这篇文章值传递和引用传递), 所以Java不存在拷贝引用, 都是对的拷贝.

浅拷贝是对值的拷贝, 基础数据类型直接拷贝值, 新变量对其修改, 不会影响之前变量的值.

深拷贝是将对象图整体进行了拷贝, 放在里新的heap上.

对象图代表一个对象向下所包含的所有属性(包括对象属性中的属性), 由此好似形成了一幅对象关系图.

# 在Java中是怎么使用的

# 浅拷贝

  1. clone()方法实现

# 深拷贝

  1. 对象中的全部引用类型属性(向里穷尽)都实现clone()
  2. 序列化与反序列化

#

# 有哪些工具类来帮助我们

  1. Apache BeanUtil.CopyProperties
  2. Apache PropertyUtils.CopyProperties
  3. Spring BeanUtils.CopyProperties
  4. cglib BeanCopier
  5. Kyro
  6. google protobuf
  7. 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”

修改于: 8/11/2022, 3:17:56 PM