「淺」或「深」 - 這是我看到沒有一個精確定義的問題 - 在實踐中Arrays.copyOf(..)
所做的方法產生一個副本源數組的更改不受源數組更改的影響。
看看下面簡單的例子爲int數組:
import java.util.Arrays;
public class DeepCopyTest
{
public static void main(String[] args)
{
int[] source = { 1, 2, 3, 4, 5, 6};
int[] target = new int[source.length];
// Copy target from source via Arrays.copyOf(..) method :
target = Arrays.copyOf(source, 6);
// Check for equality :
System.out.println("Source1 : " + Arrays.toString(source));
System.out.println("Target1 : " + Arrays.toString(target));
// Increment all entries in source array :
for(int i = 0; i < source.length; i++)
{
source[i] = source[i] +1;
}
// See if target is affected :
System.out.println("Source2 : " + Arrays.toString(source));
System.out.println("Target2 : " + Arrays.toString(target));
}
}
// OUTPUT
// ------
Source1 : [1, 2, 3, 4, 5, 6]
Target1 : [1, 2, 3, 4, 5, 6]
Source2 : [2, 3, 4, 5, 6, 7]
Target2 : [1, 2, 3, 4, 5, 6]
實際上,當人們尋求一個數組的「深層複製」,他們只是想要的東西,是改變原來未受影響。
而這個Arrays.copyOf(..)`方法確實給了它們。
除了原始類型陣列,字符串對象陣列也表現爲上述實例中,給予像輸出:
Source1 : [a, b, c, d, e, f]
Target1 : [a, b, c, d, e, f]
Source2 : [a1, b1, c1, d1, e1, f1]
Target2 : [a, b, c, d, e, f]
當初始源陣列條目由「1」串聯。
它也適用於對象數組,因爲當後者被重新分配時,目標不再與源相關聯。 但看輸出複印後兩個陣列的第一個元素,然後改變源後[0]揭示了充分的事實:
Source1 : [email protected]
Target1 : [email protected]
Source2 : [email protected]
Target2 : [email protected]
原始源陣列被複制之後,目標元件簡單地被指出無論目前在源代碼中有哪些價值。對於目標[0],它是內存地址1db9742的內容 - 也是保存源[0]的相同內存地址。 。 。 。
而我們得到源[0]重新分配後,源和目標之間的剝離的原因是由於一個事實,即賦值語句
source[0] = new Object();
只是導致源舉行的內存引用[0]到當一個新的對象被指向時被改變到一個新的位置。 因此,儘管在很多情況下它賦予編碼員與深度複製相同的好處,但它畢竟不是純粹意義上的真正深層複製。
隨着原始數據的陣列中的Arrays.copyOf(..)方法不能複製,因爲這些參考文獻都沒有用於原語。它只是將源元素值複製到目標元素中。我們再次獲得與深拷貝相同的效果,代價是代碼少於深拷貝的操作。
因此,Arrays.copyOf(..)是原始和一維對象數組的一種'廉價'深拷貝。 但是,任何數據數組更復雜,它被發現。
也許它應該被稱爲半深拷貝。
也許只是字符串 – Matthias
@Matthias的實習的另一occurence。由於「Foo」是一個字面意思,它將被實施;測試假設。如果這個假設是正確的,那麼測試調查是否目標元素已被'=「酒吧」'的相應的源元素改變。 – ToolmakerSteve
我沒有看到測試對字符串是否內化做出任何假設。我沒有看到任何身份測試,我只看到平等測試。對於淺拷貝和深拷貝,結果將是相同的,因爲淺拷貝和深拷貝之間的相等性檢驗不能不同。一個需要身份測試來區分淺拷貝和深拷貝。 –