配列のコピー
配列変数は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
どうでしょうか。intArray1しか変更していないのに、intArray2の要素の値も変わっていることが分かります。これはなぜかと言うと、intArray1をintArray2に代入した時、配列オブジェクトは複製されずに、intArray1に格納されている参照がintArray2にコピーされただけだからなんです。
2.配列変数の代入は参照のコピーになる
intArray1もintArray2も、同じ一つの配列オブジェクトを参照しているので、intArray1の要素を変更した場合は自動的にintArray2の要素も変更されることになります。
身近な例で例えると、Windowsでショートカットを作成していて、そのショートカット自体をコピーしたのと同じことです。
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







最近のコメント