マンガで分かる Java入門講座

第6章 文字列と配列
6-13. 配列7 配列の複製

配列の複製方法について、注意点と共に紹介します。

● 配列の複製

 配列は参照型のデータです。そのため、基本型のように代入を使っても、参照がコピーされるだけです。

 配列を、独立した配列として複製する際は、新たな配列を作り、そこにデータを複製する必要があります。


● 配列の複製1 for文

 配列の複製方法として、まずは1つ1つの値を自前で複製していく方法を紹介します。それは「for文」を使う方法です。

ソースコード)配列の複製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]);

出力)配列の複製1 for文
a2: 33 44 99
a1: 33 66 99

● 配列の複製2 System.arraycopy

 次の方法は「System.arraycopy」という命令を使う方法です。この命令は以下のように使います。

説明)System.arraycopy
System.arraycopy(
    複製元配列, 複製元配列の読み取り開始位置,
    複製先配列, 複製先配列の書き込み開始位置, 書き込む長さ
);

 配列を丸ごと複製する場合は、同じ要素数の配列を作り、以下のように値を設定します。

説明)System.arraycopyで丸ごと複製
System.arraycopy(
    複製元配列, 0,
    複製先配列, 0, 複製元配列.length
);

 配列を複製する方法の中では、System.arraycopyが最も高速です。

 以下は、System.arraycopyを使った配列の複製の例です。

ソースコード)配列の複製2 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]);

●配列の複製3 clone

 配列の変数の後に「.clone()」と加えることで、配列を複製できます。

ソースコード)配列の複製3 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]);

● 配列の複製4 Arrays.copyOf

 「Arrays.copyOf」命令を使うことでも、配列を複製できます。

ソースコード)配列の複製4 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」という、先頭位置も指定できる、配列複製用の命令もあります。

ソースコード)配列の複製5 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]);
    }
}

この講座のマンガ部分は「箱人形マンガ(Box Comic) 」で作成しています。
作成:2013/05/28  更新:2013/05/28  [Permalink]