では、先ほどの レベル別練習問題 に対応する 解答例と解説 をまとめます。初心者が理解しやすいように、コードと出力結果をセットで示します。
初級(基本)
問題1: コピーと代入の違い
import java.util.Arrays;
public class CopyBasic {
public static void main(String[] args) {
int[] a = {1, 2, 3};
int[] b = a; // 代入(同じ配列を参照)
int[] c = Arrays.copyOf(a, a.length); // コピー(新しい配列)
b[0] = 99; // bを変更
c[1] = 88; // cを変更
System.out.println(Arrays.toString(a)); // [99, 2, 3] ← bの変更が反映
System.out.println(Arrays.toString(b)); // [99, 2, 3]
System.out.println(Arrays.toString(c)); // [1, 88, 3] ← 独立している
}
}
Java解説:
b = a;は「同じ住所を渡す」だけ。変更が共有される。Arrays.copyOfは「新しい家を建てて中身をコピー」。独立している。
問題2: 部分コピー
import java.util.Arrays;
public class CopyPartial {
public static void main(String[] args) {
int[] nums = {10, 20, 30, 40, 50};
int[] part = new int[3];
System.arraycopy(nums, 1, part, 0, 3);
System.out.println(Arrays.toString(part)); // [20, 30, 40]
}
}
Java解説:
System.arraycopy(元, 元開始位置, 先, 先開始位置, 要素数)- 今回は
nums[1]から3つコピー →[20,30,40]
中級(応用)
問題1: 配列の拡張
import java.util.Arrays;
public class CopyExpand {
public static void main(String[] args) {
int[] a = {1, 2, 3};
int[] expanded = Arrays.copyOf(a, 5);
System.out.println(Arrays.toString(expanded)); // [1, 2, 3, 0, 0]
}
}
Java解説:
- 長さを増やすと、足りない部分は
0で埋まる。
問題2: コピーしてソート
import java.util.Arrays;
public class CopySort {
public static void main(String[] args) {
int[] data = {5, 3, 9, 1};
int[] sorted = Arrays.copyOf(data, data.length);
Arrays.sort(sorted);
System.out.println(Arrays.toString(data)); // [5, 3, 9, 1]
System.out.println(Arrays.toString(sorted)); // [1, 3, 5, 9]
}
}
Java解説:
- コピー先だけソートすれば、元の配列はそのまま。
問題3: 文字列配列のコピー
import java.util.Arrays;
public class CopyString {
public static void main(String[] args) {
String[] words = {"apple", "banana", "cherry"};
String[] copy = Arrays.copyOf(words, words.length);
copy[1] = "orange";
System.out.println(Arrays.toString(words)); // [apple, banana, cherry]
System.out.println(Arrays.toString(copy)); // [apple, orange, cherry]
}
}
Java解説:
Stringは不変(immutable)なので、コピー先を変更しても元には影響なし。
上級(オブジェクト)
問題1: 浅いコピー
class Book {
String title;
Book(String title) { this.title = title; }
}
public class ShallowCopy {
public static void main(String[] args) {
Book[] src = { new Book("Java入門"), new Book("C入門") };
Book[] shallow = java.util.Arrays.copyOf(src, src.length);
shallow[0].title = "Python入門";
System.out.println(src[0].title); // Python入門(影響あり)
System.out.println(shallow[0].title); // Python入門
}
}
Java解説:
- 配列は新しくなるが、中の
Bookオブジェクトは同じものを参照。
問題2: 深いコピー
class Book {
String title;
Book(String title) { this.title = title; }
}
public class DeepCopy {
public static void main(String[] args) {
Book[] src = { new Book("Java入門"), new Book("C入門") };
Book[] deep = new Book[src.length];
for (int i = 0; i < src.length; i++) {
deep[i] = new Book(src[i].title); // 新しいBookを作る
}
deep[0].title = "Python入門";
System.out.println(src[0].title); // Java入門(影響なし)
System.out.println(deep[0].title); // Python入門
}
}
Java解説:
- 新しいオブジェクトを作ることで、完全に独立したコピーになる。
問題3: Studentクラス(scoresもコピー)
import java.util.Arrays;
class Student {
String name;
int[] scores;
Student(String name, int[] scores) {
this.name = name;
this.scores = scores;
}
}
public class DeepCopyStudent {
public static void main(String[] args) {
Student[] src = {
new Student("Alice", new int[]{90, 80}),
new Student("Bob", new int[]{70, 60})
};
// 深いコピー
Student[] deep = new Student[src.length];
for (int i = 0; i < src.length; i++) {
deep[i] = new Student(src[i].name, Arrays.copyOf(src[i].scores, src[i].scores.length));
}
deep[0].scores[0] = 100;
System.out.println(Arrays.toString(src[0].scores)); // [90, 80](影響なし)
System.out.println(Arrays.toString(deep[0].scores)); // [100, 80]
}
}
Java解説:
scoresも新しくコピーしないと、浅いコピーでは共有されてしまう。Arrays.copyOfを使って中の配列も独立させる。
✅ まとめ
- 初級: コピーと代入の違いを理解。
- 中級: 実用的なコピー(拡張・ソート・文字列)。
- 上級: オブジェクト配列で浅いコピー/深いコピーを体験。
👉 次のステップとしては「自分でクラスを作ってコピー方法を考える」練習がおすすめです。
例えば「図書館の本リスト」「ゲームのキャラクター配列」などを題材にすると楽しく学べます。
