Java | 配列のコピー

Java Java
スポンサーリンク

配列のコピーの考え方

配列のコピーは大きく分けて 「参照コピー」「本体コピー」 の 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 を使うと別の配列になる」
  • 「オブジェクトは中身までコピーされない場合がある」
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました