在 Java 中深度複製陣列
在本教程中,我們將討論如何在 Java 中深度複製陣列。
通常,Java 中有兩種型別的陣列複製方法:淺拷貝和深拷貝。在淺拷貝中,物件被複制。另一方面,所有專案都被複制,而在深度複製中建立了一個不同的陣列。
下面是一個例子,展示了當我們直接將一個陣列複製到另一個陣列時會發生什麼。我們用專案建立一個陣列 arr1
,然後用 arr1
初始化另一個 arr2
。當 arr2
的任何元素髮生更改時,更改也會反映到 arr1
。
import java.util.Arrays;
public class DeepCopy {
public static void main(String[] args) {
int[] arr1 = {10, 20, 30};
System.out.println("arr1 Before copying: " + Arrays.toString(arr1));
int[] arr2 = arr1;
System.out.println("arr2 After copying: " + Arrays.toString(arr1));
arr2[0] = 30;
System.out.println("arr1 after copying and changing an element in arr2: " + Arrays.toString(arr1));
}
}
輸出:
arr1 Before copying: [10, 20, 30]
arr2 After copying: [10, 20, 30]
arr1 after copying and changing an element in arr2: [30, 20, 30]
在 Java 中使用 System.arraycopy()
函式進行深度複製
在下面的示例中,我們採用一個包含幾個專案的陣列 arr1
,然後採用另一個陣列 arr2
並賦予它等於 arr1
的大小。我們呼叫 System
類的 arrayCopy()
方法,該方法將一個陣列複製到另一個陣列。
arrayCopy()
函式有四個引數;前兩個是源陣列和源陣列中 copy 的起始位置。第三個引數是目標陣列及其起始位置,我們將在其中複製元素,以及要在新陣列中複製的專案數。
當我們更改 arr2
項時,就像在前面的示例中一樣,arr1
的元素根本不會更改。
import java.util.Arrays;
public class DeepCopy {
public static void main(String[] args) {
int[] arr1 = {10, 20, 30};
System.out.println("arr1 Before copying: " + Arrays.toString(arr1));
int[] arr2 = new int[arr1.length];
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
System.out.println("arr2 After copying: " + Arrays.toString(arr1));
arr2[0] = 30;
System.out.println("arr1 after copying and changing an element in arr2: " + Arrays.toString(arr1));
}
}
輸出:
arr1 Before copying: [10, 20, 30]
arr2 After copying: [10, 20, 30]
arr1 after copying and changing an element in arr2: [10, 20, 30]
在 Java 中使用 Arrays.copyOf
命令對陣列進行深度複製
下面,我們使用 Arrays
實用程式類的 copyOf()
方法。它接受要複製的陣列及其大小,然後返回相同型別的陣列。我們使用此方法建立一個新陣列 arr2
並檢查更改 arr2
是否會更改 arr1
。輸出顯示結果。
請注意,當陣列包含物件而不是基元時,此方法和前一個方法會建立淺拷貝而不是深拷貝。
import java.util.Arrays;
public class DeepCopy {
public static void main(String[] args) {
int[] arr1 = {10, 20, 30};
System.out.println("arr1 Before copying: "+Arrays.toString(arr1));
int[] arr2 = Arrays.copyOf(arr1, arr1.length);
System.out.println("arr2 After copying: "+Arrays.toString(arr1));
arr2[0] = 30;
System.out.println("arr1 after copying and changing an element in arr2: "+Arrays.toString(arr1));
}
}
輸出:
arr1 Before copying: [10, 20, 30]
arr2 After copying: [10, 20, 30]
arr1 after copying and changing an element in arr2: [30, 20, 30]
我們也可以使用 Arrays.copyOf()
來複制二維陣列。在下面的示例中,我們有一個二維陣列 arr
。我們有一個新陣列 arr2
,在迴圈中,我們使用 Arrays.copyOf
將 arr
的每個元素逐項複製到 arr2
中。複製後,我們檢查 arr1
是否更改,如果 arr2
更改。如果它沒有改變,它就是一個深度複製的陣列。
import java.util.Arrays;
public class DeepCopy {
public static void main(String[] args) {
int[][] arr = {{1, 2}, {3, 4}, {5, 6}};
System.out.println("Values of arr");
for (int i = 0; i < arr.length; i++)
for (int j = 0; j < arr.length - 1; j++)
System.out.println("arr[" + i + "][" + j + "] = "
+ arr[i][j]);
System.out.println();
int[][] arr2 = new int[arr.length][];
for (int i = 0; i < arr.length; i++) {
arr2[i] = Arrays.copyOf(arr[i], arr[i].length);
}
System.out.println("Values of arr2");
for (int i = 0; i < arr2.length; i++)
for (int j = 0; j < arr2.length - 1; j++)
System.out.println("arr2[" + i + "][" + j + "] = "
+ arr2[i][j]);
arr2[0][1] = 5;
System.out.println();
System.out.println("Values of arr after changing an element in arr2");
for (int i = 0; i < arr.length; i++)
for (int j = 0; j < arr.length - 1; j++)
System.out.println("arr[" + i + "][" + j + "] = "
+ arr[i][j]);
}
}
輸出:
Values of arr
arr[0][0] = 1
arr[0][1] = 2
arr[1][0] = 3
arr[1][1] = 4
arr[2][0] = 5
arr[2][1] = 6
Values of arr2
arr2[0][0] = 1
arr2[0][1] = 2
arr2[1][0] = 3
arr2[1][1] = 4
arr2[2][0] = 5
arr2[2][1] = 6
Values of arr after changing an element in arr2
arr[0][0] = 1
arr[0][1] = 2
arr[1][0] = 3
arr[1][1] = 4
arr[2][0] = 5
arr[2][1] = 6
Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn