Java で配列をディープコピーする
このチュートリアルでは、Java で配列をディープコピーする方法について説明します。
一般に、Java には、浅いコピーと深いコピーの 2 種類の配列コピー方法があります。浅いコピーでは、オブジェクトがコピーされます。一方、Deep Copy で別の配列が作成されている間に、すべてのアイテムがコピーされます。
以下は、配列を別の配列に直接コピーしたときに何が起こるかを示す例です。アイテムを使用して配列 arr1
を作成してから、別の arr2
を arr1
で初期化します。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 Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn