在 Java 中深度複製陣列

Rupam Yadav 2023年10月12日
  1. 在 Java 中使用 System.arraycopy() 函式進行深度複製
  2. 在 Java 中使用 Arrays.copyOf 命令對陣列進行深度複製
在 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.copyOfarr 的每個元素逐項複製到 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 Yadav
Rupam Yadav avatar Rupam Yadav avatar

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

相關文章 - Java Array