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

第6章 文字列と配列
6-14. 配列8 配列の複製2

配列の複製方法、その2です。

● シャローコピー

 参照型の配列では、各要素に入っているのは参照です。通常の方法で配列を複製した場合は、新たな配列は作成されますが、その中に入っている参照は、元の配列と同じオブジェクト(本体)を指しています。

 こういったコピーのことを「シャローコピー」(浅いコピー)と呼びます。

図)シャローコピー
┏━配列a1━━━━━━━━━━━━━━━━┓
┃┏━━━┓┏━━━┓┏━━━┓┏━━━┓┃
┃┃参 照┃┃参 照┃┃参 照┃┃参 照┃┃
┃┗━━━┛┗━━━┛┗━━━┛┗━━━┛┃
┃  :    :    :    :  ┃
┗━━:━━━━:━━━━:━━━━:━━┛
   :    :    :    :
 ┏配列━┓┏配列━┓┏配列━┓┏配列━┓
 ┃┏━┓┃┃┏━┓┃┃┏━┓┃┃┏━┓┃
 ┃┃ 0┃┃┃┃ 2┃┃┃┃ 4┃┃┃┃ 6┃┃
 ┃┗━┛┃┃┗━┛┃┃┗━┛┃┃┗━┛┃
 ┃┏━┓┃┃┏━┓┃┃┏━┓┃┃┏━┓┃
 ┃┃ 1┃┃┃┃ 3┃┃┃┃ 5┃┃┃┃ 7┃┃
 ┃┗━┛┃┃┗━┛┃┃┗━┛┃┃┗━┛┃
 ┗━━━┛┗━━━┛┗━━━┛┗━━━┛
   :    :    :    :
┏━━:━━━━:━━━━:━━━━:━━┓
┃  :    :    :    :  ┃
┃┏━━━┓┏━━━┓┏━━━┓┏━━━┓┃
┃┃参 照┃┃参 照┃┃参 照┃┃参 照┃┃
┃┗━━━┛┗━━━┛┗━━━┛┗━━━┛┃
┗━配列a2━━━━━━━━━━━━━━━━┛

● ディープコピー

 シャローコピーに対して、内部から参照しているオブジェクト(本体)を、全て複製して新たに配列に格納する方法を、「ディープコピー」(深いコピー)と呼びます。

図)ディープコピー
┏━配列a1━━━━━━━━━━━━━━━━┓
┃┏━━━┓┏━━━┓┏━━━┓┏━━━┓┃
┃┃参 照┃┃参 照┃┃参 照┃┃参 照┃┃
┃┗━━━┛┗━━━┛┗━━━┛┗━━━┛┃
┃  :    :    :    :  ┃
┗━━:━━━━:━━━━:━━━━:━━┛
   :    :    :    :
 ┏配列━┓┏配列━┓┏配列━┓┏配列━┓
 ┃┏━┓┃┃┏━┓┃┃┏━┓┃┃┏━┓┃
 ┃┃ 0┃┃┃┃ 2┃┃┃┃ 4┃┃┃┃ 6┃┃
 ┃┗━┛┃┃┗━┛┃┃┗━┛┃┃┗━┛┃
 ┃┏━┓┃┃┏━┓┃┃┏━┓┃┃┏━┓┃
 ┃┃ 1┃┃┃┃ 3┃┃┃┃ 5┃┃┃┃ 7┃┃
 ┃┗━┛┃┃┗━┛┃┃┗━┛┃┃┗━┛┃
 ┗━━━┛┗━━━┛┗━━━┛┗━━━┛

 ┏配列━┓┏配列━┓┏配列━┓┏配列━┓
 ┃┏━┓┃┃┏━┓┃┃┏━┓┃┃┏━┓┃
 ┃┃ 0┃┃┃┃ 2┃┃┃┃ 4┃┃┃┃ 6┃┃
 ┃┗━┛┃┃┗━┛┃┃┗━┛┃┃┗━┛┃
 ┃┏━┓┃┃┏━┓┃┃┏━┓┃┃┏━┓┃
 ┃┃ 1┃┃┃┃ 3┃┃┃┃ 5┃┃┃┃ 7┃┃
 ┃┗━┛┃┃┗━┛┃┃┗━┛┃┃┗━┛┃
 ┗━━━┛┗━━━┛┗━━━┛┗━━━┛
   :    :    :    :
┏━━:━━━━:━━━━:━━━━:━━┓
┃  :    :    :    :  ┃
┃┏━━━┓┏━━━┓┏━━━┓┏━━━┓┃
┃┃参 照┃┃参 照┃┃参 照┃┃参 照┃┃
┃┗━━━┛┗━━━┛┗━━━┛┗━━━┛┃
┗━配列a2━━━━━━━━━━━━━━━━┛

 ディープコピーは、各要素を複製する手順を踏まなければなりません。

ソースコード)ディープコピー1
int[][] a1 = {
    {0, 1}, {2, 3}, {4, 5}, {6, 7}
};
int len1 = a1.length;
int[][] a2 = new int[len1][];

for (int i = 0; i < len1; i ++) {
    int len2 = a1[i].length;
    a2[i] = new int[len2];
    for (int j = 0; j < len2; j ++) {
        a2[i][j] = a1[i][j];
    }
}

ソースコード)ディープコピー2
int[][] a1 = {
    {0, 1}, {2, 3}, {4, 5}, {6, 7}
};
int[][] a2 = a1.clone();

for (int i = 0; i < a1.length; i ++) {
    a2[i] = a1[i].clone();
}

 また、基本型のデータでは、参照ではなく値が直接入っているので、シャローコピー、ディープコピーの区別はありません。


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