配列のコピーの考え方
配列のコピーは大きく分けて 「参照コピー」 と 「本体コピー」 の 2 種類があります。
1. 参照コピー(同じ配列を指す)
int[] src = {10, 20, 30};
int[] dst = src;
dst[0] = 99;
System.out.println("src[0] = " + src[0]);
Javaポイント
dst = src;とすると dst も src と同じ配列を見ているだけ。- だから
dst[0]を変えるとsrc[0]も変わってしまいます。
実行結果
src[0] = 99
💡 初心者向けの覚え方:
「変数に = で渡すと住所だけコピーされる」とイメージするとわかりやすいです。
2. 手動で配列をコピーする(基本型の場合)
int[] src = {10, 20, 30};
int[] dst = new int[3]; // 新しい配列を作る
for (int i = 0; i < src.length; i++) {
dst[i] = src[i]; // 要素を1つずつコピー
}
dst[0] = 99;
System.out.println("src[0] = " + src[0]);
System.out.println("dst[0] = " + dst[0]);
Java実行結果
src[0] = 10
dst[0] = 99
ポイント
- 手動コピーだと src と dst は別の配列になるので、片方を変えてももう片方には影響なし。
- 基本型(int, double, boolean など)なら安心。
3. Arrays.copyOf を使う(もっと簡単にコピー)
import java.util.Arrays;
int[] src = {10, 20, 30};
int[] dst = Arrays.copyOf(src, src.length);
dst[1] = 99;
System.out.println(Arrays.toString(src));
System.out.println(Arrays.toString(dst));
Java実行結果
[10, 20, 30]
[10, 99, 30]
ポイント
Arrays.copyOf(コピー元, コピーする長さ)で簡単に別配列を作れる。- 「自分でループを書かなくても OK」と覚える。
4. System.arraycopy を使う(効率的なコピー)
int[] src = {10, 20, 30};
int[] dst = new int[3];
System.arraycopy(src, 0, dst, 0, src.length);
dst[2] = 99;
System.out.println(Arrays.toString(src));
System.out.println(Arrays.toString(dst));
Java実行結果
[10, 20, 30]
[10, 20, 99]
ポイント
System.arraycopy(コピー元, コピー開始位置, コピー先, コピー開始位置, 長さ)- 手動ループより少し短く書けて効率的。
5. 参照型の配列は要注意(シャローコピー)
class Person {
String name;
Person(String name) { this.name = name; }
}
Person[] src = { new Person("Alice"), new Person("Bob") };
Person[] dst = Arrays.copyOf(src, src.length);
dst[0].name = "Charlie";
System.out.println(src[0].name);
Java実行結果
Charlie
ポイント
- 配列本体はコピーされているが、中のオブジェクトは同じものを指しているので注意。
- これを「浅いコピー(シャローコピー)」と呼ぶ。
- 完全に別のオブジェクトにしたい場合は、新しいオブジェクトを作る必要があります(ディープコピー)。
Person[] dst2 = new Person[src.length];
for(int i = 0; i < src.length; i++){
dst2[i] = new Person(src[i].name); // 新しいオブジェクトを作る
}
Java初心者向けまとめ
| 方法 | 配列本体は別? | 要素(オブジェクト)は別? | メモ |
|---|---|---|---|
= 代入 | × | × | 参照コピー、片方を変えるともう片方も変わる |
| 手動ループコピー | ○ | ○(基本型) | 安全、簡単 |
Arrays.copyOf | ○ | ○(基本型) | 簡単、便利 |
System.arraycopy | ○ | ○(基本型) | 効率的、少し長めの書き方 |
| 参照型のコピー | ○ | ×(シャローコピー) | ディープコピーが必要な場合は手動で新しいオブジェクトを作る |
覚え方のコツ
- 「= だけでは同じ配列を見ているだけ」
- 「手動コピーや copyOf、arraycopy を使うと別の配列になる」
- 「オブジェクトは中身までコピーされない場合がある」
