配列のコピー

配列変数はint型などと違って参照ですので、単純にコピーすると参照がコピーされてしまうので注意が必要です。

参照のコピー 目次

1.配列変数をコピーする

配列をコピー(複製を作る)際、単純に配列変数を他の配列変数に代入するとコピーできますが、この場合は参照がコピーされるだけで実体は同じですので注意が必要です。

package pac01;

public class HelloWorld {
	public static void main(String[] args) {
		
		// int型の配列変数を宣言
		int[] intArray1 = new int[]{3, 2, 7};
		int[] intArray2 = null;
		
		// 配列をコピー(配列変数の代入)
		intArray2 = intArray1;
		
		// 両方の配列の各要素の値を表示する
		System.out.println(intArray1[0] + " " + intArray2[0]);
		System.out.println(intArray1[1] + " " + intArray2[1]);
		System.out.println(intArray1[2] + " " + intArray2[2]);
	}
}
-------------------------------------------------------------
3 3
2 2
7 7

配列変数の代入

intArray1をintArray2に代入しています。それぞれの要素の中身を表示させて見ると、同じ値が表示されていることから配列のコピーは上手く行っているようです。

この状態から、intArray1の要素の値を変更してみます。

package pac01;

public class HelloWorld {
	public static void main(String[] args) {
		
		// int型の配列変数を宣言
		int[] intArray1 = new int[]{3, 2, 7};
		int[] intArray2 = null;
		
		// 配列をコピー(配列変数の代入)
		intArray2 = intArray1;
		
		// 両方の配列の各要素の値を表示する
		System.out.println(intArray1[0] + " " + intArray2[0]);
		System.out.println(intArray1[1] + " " + intArray2[1]);
		System.out.println(intArray1[2] + " " + intArray2[2]);
		
		// intArray1の要素の値を変更する
		intArray1[0] = 10;
		intArray1[1] = 20;
		intArray1[2] = 30;
		
		// 両方の配列の各要素の値を表示する
		System.out.println(intArray1[0] + " " + intArray2[0]);
		System.out.println(intArray1[1] + " " + intArray2[1]);
		System.out.println(intArray1[2] + " " + intArray2[2]);		
	}
}
---------------------------------------------------------------
3 3
2 2
7 7
10 10
20 20
30 30

配列変数の代入2

どうでしょうか。intArray1しか変更していないのに、intArray2の要素の値も変わっていることが分かります。これはなぜかと言うと、intArray1をintArray2に代入した時、配列オブジェクトは複製されずに、intArray1に格納されている参照がintArray2にコピーされただけだからなんです。

2.配列変数の代入は参照のコピーになる

intArray1もintArray2も、同じ一つの配列オブジェクトを参照しているので、intArray1の要素を変更した場合は自動的にintArray2の要素も変更されることになります。

参照のコピー

身近な例で例えると、Windowsでショートカットを作成していて、そのショートカット自体をコピーしたのと同じことです。

参照のコピー2

3.ちゃんと配列をコピー(複製を作成)するには

コピーとは複製を作成することですので、ちゃんと配列をコピーするには、配列オブジェクト自体を別途作成し、各要素の値同士を代入してあげる必要があります。

package pac01;

public class HelloWorld {
	public static void main(String[] args) {
		
		// コピー元の配列
		int[] intArray1 = new int[]{3, 2, 7};
		// コピー先の配列オブジェクトを用意
		int[] intArray2 = new int[3];

		// intArray1からintArray2に、各要素の値を代入(コピー)
		intArray2[0] = intArray1[0];
		intArray2[1] = intArray1[1];
		intArray2[2] = intArray1[2];

		// 両方の配列の各要素の値を表示する
		System.out.println(intArray1[0] + " " + intArray2[0]);
		System.out.println(intArray1[1] + " " + intArray2[1]);
		System.out.println(intArray1[2] + " " + intArray2[2]);
	}
}
---------------------------------------------------------------
3 3
2 2
7 7

各要素の値の代入1

各要素の値の代入2

コメントを残す

サブコンテンツ

このページの先頭へ