对Java中浅拷贝与深拷贝的理解

在项目中看到前人写的代码用到了 spring 框架的 BeanUtils.copyProperties 方法,想了解一下这个方法是深拷贝仍是浅拷贝,其实这个方法内部对于基本数据类型实现了深拷贝,但对于引用类型仍是浅拷贝的。spring

1、什么是浅拷贝和深拷贝

在 Java 中,除了基本数据类型(元类型)以外,还存在类的实例对象这个引用数据类型。而通常使用 『 = 』号作赋值操做的时候。对于基本数据类型,其实是拷贝的它的值,可是对于对象而言,其实赋值的只是这个对象的引用,将原对象的引用传递过去,他们实际上仍是指向的同一个对象。segmentfault

而浅拷贝和深拷贝就是在这个基础之上作的区分,若是在拷贝这个对象的时候,只对基本数据类型进行了拷贝,而对引用数据类型只是进行了引用的传递,而没有真实的建立一个新的对象,则认为是浅拷贝。反之,在对引用数据类型进行拷贝的时候,建立了一个新的对象,而且复制其内的成员变量,则认为是深拷贝。框架

所以,所谓的浅拷贝和深拷贝,只是在拷贝对象的时候,对 类的实例对象 这种引用数据类型的不一样操做而已。spa

总结来讲:对象

  • 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
  • 深拷贝:对基本数据类型进行值传递,对引用数据类型,建立一个新的对象,并复制其内容,此为深拷贝。

2、实现深拷贝的方法

浅拷贝和深拷贝实际上是相对的:get

  • 若是一个对象内部只有基本数据类型,那用 clone() 方法获取到的就是这个对象的深拷贝
  • 而若是其内部还有引用数据类型,那用 clone() 方法就是一次浅拷贝的操做。

那么,如何进行一个深拷贝呢?io

比较经常使用的方案有两种:基础

  1. 序列化(serialization)这个对象,再反序列化回来,就能够获得这个新的对象,无非就是序列化的规则须要咱们本身来写。
  2. 继续利用 clone() 方法,既然 clone() 方法,是咱们来重写的,实际上咱们能够对其内的引用类型的变量,再进行一次 clone()。

 

参考文章:http://www.javashuo.com/article/p-xrwkraip-dq.html变量

相关文章
相关标签/搜索