配列のコピー
配列変数は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
最近のコメント