Java で配列をディープコピーする

Rupam Yadav 2023年10月12日
  1. Java で System.arraycopy() 関数を使用したディープコピー
  2. Java で Arrays.copyOf コマンドを使用して配列をディープコピーする
Java で配列をディープコピーする

このチュートリアルでは、Java で配列をディープコピーする方法について説明します。

一般に、Java には、浅いコピーと深いコピーの 2 種類の配列コピー方法があります。浅いコピーでは、オブジェクトがコピーされます。一方、Deep Copy で別の配列が作成されている間に、すべてのアイテムがコピーされます。

以下は、配列を別の配列に直接コピーしたときに何が起こるかを示す例です。アイテムを使用して配列 arr1 を作成してから、別の arr2arr1 で初期化します。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() 関数は 4つの引数を取ります。最初の 2つは、ソース配列とソース配列内のコピーの開始位置です。3 番目の引数は、要素をコピーする宛先配列とその開始位置、および新しい配列にコピーされるアイテムの数です。

前の例のように、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() を使用して 2 次元配列をコピーすることもできます。以下の例では、2D 配列 arr があります。新しい配列 arr2 があり、ループでは、arr のすべての要素を取得してアイテムごとに arr2 にコピーする Arrays.copyOf を使用します。コピーしたら、arr2 が変更された場合に arr1 が変更されるかどうかを確認します。変更されない場合は、深くコピーされた配列です。

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