配列は参照型のデータです。そのため、基本型のように代入を使っても、参照がコピーされるだけです。
配列を、独立した配列として複製する際は、新たな配列を作り、そこにデータを複製する必要があります。
配列の複製方法として、まずは1つ1つの値を自前で複製していく方法を紹介します。それは「for文」を使う方法です。
int[] a1 = {33, 66, 99}; int[] a2 = new int[a1.length]; for (int i = 0; i < a1.length; i ++) { a2[i] = a1[i]; } a2[1] = 44; // a2の要素1の値を書き換え System.out.println("a2: "+a2[0]+" "+a2[1]+" "+a2[2]); System.out.println("a1: "+a1[0]+" "+a1[1]+" "+a1[2]);
a2: 33 44 99 a1: 33 66 99
次の方法は「System.arraycopy」という命令を使う方法です。この命令は以下のように使います。
System.arraycopy( 複製元配列, 複製元配列の読み取り開始位置, 複製先配列, 複製先配列の書き込み開始位置, 書き込む長さ );
配列を丸ごと複製する場合は、同じ要素数の配列を作り、以下のように値を設定します。
System.arraycopy( 複製元配列, 0, 複製先配列, 0, 複製元配列.length );
配列を複製する方法の中では、System.arraycopyが最も高速です。
以下は、System.arraycopyを使った配列の複製の例です。
int[] a1 = {33, 66, 99}; int[] a2 = new int[a1.length]; System.arraycopy(a1, 0, a2, 0, a1.length); a2[1] = 44; // a2の要素1の値を書き換え System.out.println("a2: "+a2[0]+" "+a2[1]+" "+a2[2]); System.out.println("a1: "+a1[0]+" "+a1[1]+" "+a1[2]);
配列の変数の後に「.clone()」と加えることで、配列を複製できます。
int[] a1 = {33, 66, 99}; int[] a2 = a1.clone(); a2[1] = 44; // a2の要素1の値を書き換え System.out.println("a2: "+a2[0]+" "+a2[1]+" "+a2[2]); System.out.println("a1: "+a1[0]+" "+a1[1]+" "+a1[2]);
「Arrays.copyOf」命令を使うことでも、配列を複製できます。
package sample; import java.util.Arrays; // これが事前に必要 public class Test { public static void main(String[] args) { int[] a1 = {33, 66, 99}; int[] a2 = Arrays.copyOf(a1, a1.length); a2[1] = 44; // a2の要素1の値を書き換え System.out.println("a2: "+a2[0]+" "+a2[1]+" "+a2[2]); System.out.println("a1: "+a1[0]+" "+a1[1]+" "+a1[2]); } }
また、「Arrays.copyOfRange」という、先頭位置も指定できる、配列複製用の命令もあります。
package sample; import java.util.Arrays; // これが事前に必要 public class Test { public static void main(String[] args) { int[] a1 = {33, 66, 99}; int[] a2 = Arrays.copyOfRange(a1, 0, a1.length); a2[1] = 44; // a2の要素1の値を書き換え System.out.println("a2: "+a2[0]+" "+a2[1]+" "+a2[2]); System.out.println("a1: "+a1[0]+" "+a1[1]+" "+a1[2]); } }