對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變量

相關文章
相關標籤/搜索